题目描述
根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
- 示例 :
- 输入: [“4”, “13”, “5”, “/”, “+”]
- 输出: 6
- 解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
题解:
遍历后缀表达式:
1.用一个辅助栈存放操作数。若当前元素为操作数,则入栈。
2.若当前元素为操作符,则将栈顶元素以及它后一个元素出栈(注意:先出栈的做为右操作数,后出栈的为左操作数),然后将计算结果入栈。
3.最后栈中只剩一个元素,即为后缀表达式计算结果。
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st; //存放操作数
int i=0;
while(i < tokens.size()){
//如果是操作符,则将栈顶元素和它的后一个元素出栈(先出栈的位右操作数),然后将计算结果入栈
if(tokens[i]=="+" || tokens[i]=="-" || tokens[i]=="*" || tokens[i]=="/"){
int right=st.top(); st.pop();
int left=st.top(); st.pop();
if(tokens[i]=="+") st.push(left+right);
else if(tokens[i]=="-") st.push(left-right);
else if(tokens[i]=="*") st.push(left*right);
else if(tokens[i]=="/") st.push(left/right);
}
//如果是操作数,则入栈
else
st.push(stoi(tokens[i]));
++i;
}
return st.top(); //返回栈顶元素
}
};