您的位置:首页 > 编程语言 > Lua

LeetCode 150 — Evaluate Reverse Polish Notation(C++ Java Python)

2014-03-01 15:34 543 查看
题目: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())

        感谢阅读,欢迎评论!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode