- 描述
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +, -, *, /. Each operand may be an integer or another expression.
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
- 思路
观察其中的规律可以比较容易发现,如果出现了非数字的符号,那么一定是这个两个前面的数字做运算,得到结果a,而如果出现了第二个符号,那么就一定是倒数第三个与a做运算。通过这样的规律,比较容易想到使用栈进行数据的存储,如果遇到了数,则将这个数压入栈中,如果遇到了符号,则将栈中顶上两个元素取出做运算,然后将结果压入栈中。下面给出相应的代码。 - 代码(c#)
public int EvalRPN(string[] tokens) {
Stack<int> stack = new Stack<int>();
int value = 0;
for (int i = 0; i < tokens.Length; i++)
{
if (int.TryParse(tokens[i], out value))
{
stack.Push(value);//遇到数字,则将其压入栈中
}
else//遇到了运算符号
{
value = stack.Pop();//取出第一个数
switch (tokens[i])
{
case "*":
value *= stack.Pop();
break;
case "/":
value = stack.Pop() / value;
break;
case "+":
value += stack.Pop();
break;
default:
value = stack.Pop() - value;
break;
}
stack.Push(value);//将栈顶部的两个元素的运算结果压入栈中
}
}
return stack.Pop();//栈中的最后一个数字即是最后的结果
}