给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 ' '、'-'、'*' 和 '/' 。 每个操作数(运算对象)都可以是一个整数或者另一个表达式。 两个整数之间的除法总是 向零截断 。 表达式中不含除零运算。 输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。 题目分析
这道题首先要理解逆波兰表达式的运算规则【题目中已有提示】。逆波兰表达式就是把我们正常的中缀表达式转换为一种计算机方便实现运算的表达式。
逆波兰表达式的运算规则是:
当遇到一个运算符时,我们对最近访问的两个数字执行对应的操作,并且先访问的数字在运算符之后,后访问的数字在运算符之前。 每一次的运算结果,也是一个最近访问的数字。
由于我们要对最近访问的数字进行操作,很显然对数字的操作是后入先出,因此使用栈结构来存储遇到的数字。栈顶数字即为最近访问的数字。 而 每一次的运算结果,也是一个最近访问的数字,即需要将运算结果也入栈。 代码
注意: Python中的除法运算应该对计算结果使用int()转化,而不能使用运算符//。因为后者是向下取整而不是向零取整,结果为负数时会有歧义。
代码语言:javascript复制class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> nums; // 存储数字的栈
int num1; // 进行运算的数字1
int num2; // 进行运算的数字2
for(string t: tokens){
if(t == " " || t == "-" || t == "*" || t == "/"){
// 当前字符串是运算符,从栈中依次弹出两个数进行运算,并将运算结果入栈
num1 = nums.top();
nums.pop();
num2 = nums.top();
nums.pop();
if(t == " ")nums.push(num2 num1);
else if(t == "-")nums.push(num2 - num1);
else if(t == "*")nums.push(num2 * num1);
else{nums.push(num2 / num1);}
}else{
// 当前字符是数字,转为数字直接入栈
nums.push((atoi(t.c_str())));
}
}
return nums.top(); // 最终栈内留的唯一数字即为结果
}
};