1,题目要求
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +, -, *, /. Each operand may be an integer or another expression.
Note:
- Division between two integers should truncate toward zero.
- The given RPN expression is always valid. That means the expression would always evaluate to a result and there won’t be any divide by zero operation.
Example 1:
Input: [“2”, “1”, “+”, “3”, “*”]
Output: 9
Explanation: ((2 + 1) * 3) = 9
Example 2:
Input: [“4”, “13”, “5”, “/”, “+”]
Output: 6
Explanation: (4 + (13 / 5)) = 6
Example 3:
Input: [“10”, “6”, “9”, “3”, “+”, “-11”, “", “/”, "”, “17”, “+”, “5”, “+”]
Output: 22
Explanation:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
在反向波兰表示法中计算算术表达式的值。
有效的运算符是+, - ,*,/。 每个操作数可以是整数或另一个表达式。
注意:
- 两个整数之间的划分应截断为零。
- 给定的RPN表达式始终有效。 这意味着表达式总是会计算结果,并且不会有任何除零操作。
2,题目思路
对于这道题,要求对一个后缀表达式进行解析并求出最后的结果。
后缀表达式非常简单,而且也是栈的运用的一个最经典的例子,这里也不需要赘述了。
唯一一点要说的,就是stoi可以直接将字符串数字转换为int型,而不一定非要是char类型。
3,代码实现
static auto speedup = [](){
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
int a,b;
for(auto &t : tokens){
if(op.count(t)!=0){
if(t == "+"){
a = st.top();st.pop();
b = st.top();st.pop();
st.push(b+a);
continue;
}
else if(t == "-"){
a = st.top();st.pop();
b = st.top();st.pop();
st.push(b-a);
continue;
}
else if(t == "*"){
a = st.top();st.pop();
b = st.top();st.pop();
st.push(b*a);
continue;
}
else if(t == "/"){
a = st.top();st.pop();
b = st.top();st.pop();
st.push(b/a);
continue;
}
}
else
st.push(stoi(t));
}
return st.top();
}
private:
set<string> op = {"+", "-", "*", "/"};
};