题目:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/
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
题目翻译:
求逆波兰式算术表达式的值。
有效的运算符有+,-,*,/。每个操作数可以是整数或另一个表达式。
分析:
使用stack。注意python除法的特殊性,当结果为负数时向靠近-∞的方向取整。
C++实现:
class Solution {
public:
int evalRPN(vector<string> &tokens) {
std::stack<int> s;
string operators = "+-*/";
int num1 = 0;
int num2 = 0;
for(int i = 0; i < tokens.size(); ++i)
{
int pos = operators.find(tokens[i]);
if(pos == string::npos)
{
s.push(atoi(tokens[i].c_str()));
}
else
{
num2 = s.top();
s.pop();
num1 = s.top();
s.pop();
if(tokens[i] == "+")
{
s.push(num1 + num2);
}
else if(tokens[i] == "-")
{
s.push(num1 - num2);
}
else if(tokens[i] == "*")
{
s.push(num1 * num2);
}
else
{
if(num2 != 0)
{
s.push(num1 / num2);
}
}
}
}
return s.top();
}
};
Java实现:
public class Solution {
public int evalRPN(String[] tokens) {
String operators = "+-*/";
Stack<String> s = new Stack<String>();
for (String str : tokens) {
if (operators.contains(str)) {
int num2 = Integer.valueOf(s.pop());
int num1 = Integer.valueOf(s.pop());
int index = operators.indexOf(str);
switch (index) {
case 0:
s.push(String.valueOf(num1 + num2));
break;
case 1:
s.push(String.valueOf(num1 - num2));
break;
case 2:
s.push(String.valueOf(num1 * num2));
break;
case 3:
s.push(String.valueOf(num1 / num2));
break;
}
} else {
s.push(str);
}
}
return Integer.valueOf(s.pop());
}
}
Python实现:
class Solution:
# @param tokens, a list of string
# @return an integer
def evalRPN(self, tokens):
operators = "+-*/"
stack = []
for s in tokens:
if s in operators:
num2 = int(stack.pop())
num1 = int(stack.pop())
if s == "+":
num1 += num2
elif s == "-":
num1 -= num2
elif s == "*":
num1 *= num2
else:
if num1 / num2 < 0 and num1 % num2 != 0:
num1 = num1 / num2 + 1
else:
num1 /= num2
stack.append(str(num1))
else:
stack.append(s)
return int(stack.pop())
感谢阅读,欢迎评论!