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

LeetCode——Evaluate Reverse Polish Notation

2014-05-05 20:32 435 查看


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


思路:

Reverse Polish Notation(逆波兰表示法)——参考维基百科


伪代码

while有输入符号
读入下一个符号
IF是一个操作数
入栈

ELSE IF是一个操作符
有一个先验的表格给出该操作符需要n个参数
IF堆栈中少于n个操作数
(错误) 用户没有输入足够的操作数

Else,n个操作数出栈
计算操作符。
将计算所得的值入栈

IF栈内只有一个值
这个值就是整个计算式的结果

ELSE多于一个值
(错误) 用户输入了多余的操作数


例子

中缀表达式“5 + ((1 + 2) * 4) − 3”写作

5 1 2 + 4 * + 3 −下表给出了该逆波兰表达式从左至右求值的过程,堆栈栏给出了中间值,用于跟踪算法。
输入操作堆栈注释
5入栈5
1入栈5, 1
2入栈5, 1, 2
+加法运算5, 3(1, 2)出栈;将结果(3)入栈
4入栈5, 3, 4
*乘法运算5, 12(3, 4)出栈;将结果(12)入栈
+加法运算17(5, 12)出栈;将结果 (17)入栈
3入栈17, 3
减法运算14(17, 3)出栈;将结果(14)入栈
计算完成时,栈内只有一个操作数,这就是表达式的结果:14
上述运算可以重写为如下运算链方法(用于HP的逆波兰计算器):

1 2 + 4 * 5 + 3 −

代码:
class Solution {
public:
int evalRPN(vector<string> &tokens) {
stack<int> st;
int x, y;
for (int i = 0; i < tokens.size(); i++) {
//说明是表达式
if ((tokens[i][0] >= '0' && tokens[i][0] <= '9')
|| (tokens[i].length() > 1)) {
x = 0;
int j = 0;
if (tokens[i][0] == '-')
j++;
for (; j < tokens[i].length(); j++) {
x = x * 10 + (tokens[i][j] - '0');
}
if (tokens[i][0] == '-')
x = -x;
st.push(x);
} else {
if (st.size() < 2)
return -1;
x = st.top();
st.pop();
y = st.top();
st.pop();
if (tokens[i][0] == '+')
st.push(x + y);
else if (tokens[i][0] == '-')
st.push(y - x);
else if (tokens[i][0] == '*')
st.push(y * x);
else if (tokens[i][0] == '/')
st.push(y / x);
else
return -1;
}
}
return st.empty() ? 0 : st.top();
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode c++