1.题目
求逆波兰表达式的值。
在逆波兰表达法中,其有效的运算符号包括 +
, -
, *
, /
。每个运算对象可以是整数,也可以是另一个逆波兰计数表达。
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
2.算法
public int evalRPN(String[] tokens)
{
if (tokens == null || tokens.length == 0)
{
return 0;
}
LinkedList<Integer> stack = new LinkedList<Integer>();
for (int i = 0; i < tokens.length; i++)
{
if (tokens[i].equals("+"))
{
stack.push(stack.pop() + stack.pop());
}
else if (tokens[i].equals("-"))
{
stack.push(-stack.pop() + stack.pop());
}
else if (tokens[i].equals("*"))
{
stack.push(stack.pop() * stack.pop());
}
else if (tokens[i].equals("/"))
{
int i1 = stack.pop();
int i2 = stack.pop();
stack.push(i2 / i1);
}
else
{
stack.push(Integer.parseInt(tokens[i]));
}
}
return stack.pop();
}
本题基本思路是
维护一个运算数栈,读到运算数的时候直接进栈,而每得到一个运算符,就从栈顶取出两个运算数,运算之后将结果做为一个运算数放回栈中,直到式子结束,此时栈中唯一一个元素便是结果。
def evalRPN(self, tokens):
# Write your code here
stack = []
for i in tokens:
if i not in ['+', '-', '*', '/']:
stack.append(int(i))
else:
num2 = stack.pop()
num1 = stack.pop()
if i == '+': stack.append(num1 + num2)
elif i == '-': stack.append(num1 - num2)
elif i == '*': stack.append(num1 * num2)
else: stack.append(int(num1 * 1.0 / num2))
return stack.pop()