逆波兰表达式求值
根据 逆波兰表示法
,求表达式的值。
有效的算符包括 +、-、*、/
。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
示例:
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
思路
解法一:
使用栈
- 判断字符是否为符号,若为数字,则转成相应的十进制数,将数字放到栈中;
- 若为符号,则从栈中 push 出两个数,根据栈的特性,第一个数是num2,第二个数是num1;
- 然后判断符号,将运算结果 push 到栈中;
- 最后栈中只剩下最后的结果。
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> stk;
int n = tokens.size();
for (int i = 0; i < n; i++) {
string& token = tokens[i];
if (isNumber(token)) {
stk.push(atoi(token.c_str())); // 转成数字
} else {
int num2 = stk.top(); //出栈的第一个数是num2
stk.pop();
int num1 = stk.top(); //出栈的第二个数是num1
stk.pop();
switch (token[0]) {
case '+':
stk.push(num1 + num2);
break;
case '-':
stk.push(num1 - num2);
break;
case '*':
stk.push(num1 * num2);
break;
case '/':
stk.push(num1 / num2);
break;
}
}
}
return stk.top();
}
bool isNumber(string& token) {
return !(token == "+" || token == "-" || token == "*" || token == "/");
}
};