
在解决此问题之前,我先为大家介绍一下什么是逆波兰表达式:
逆波兰表达式,是一种后缀表达式,所谓后缀就是指运算符写在后面。
平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
逆波兰表达式主要有以下两个优点:
1、去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
2、适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
在介绍完逆波兰表达式后,我们就要来解决这个问题了。在做这道题的时候,我们依然可以从上一道题----“1047. 删除字符串中的所有相邻重复项”中得到启发,这道题中我们需要把运算符前面的两个数字进行运算,再将运算结果保留并进行后面的运算,这也是一个消除的过程,只不过在消除过后我们还需要把运算结果再保存回去,具体解法如下:
在遍历整个表达式的过程中,遇到数字就将其存入栈中,遇到运算符就从栈中弹出两个数据根据此运算符进行计算再将计算结果存入栈中,最后栈中的数据就是整个表达式的运算结果,具体代码如下:
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> sta = new Stack<>();
int sum = 0;
for(int i = 0; i < tokens.length; i++) {
if(!tokens[i].equals("+") && !tokens[i].equals("-") && !tokens[i].equals("*") && !tokens[i].equals("/")) {
sta.push(Integer.valueOf(tokens[i]));
} else {
if(tokens[i].equals("+")) {
sta.push(sta.pop() + sta.pop());
} else if(tokens[i].equals("-")) {
int a = sta.pop();
int b = sta.pop();
sta.push(b - a);
} else if(tokens[i].equals("*")) {
sta.push(sta.pop() * sta.pop());
} else if(tokens[i].equals("/")) {
int a = sta.pop();
int b = sta.pop();
sta.push(b / a);
}
}
}
return sta.pop();
}
}
文章介绍了逆波兰表达式的基本概念,它是一种无括号且无歧义的表达方式,适合栈操作。提供了一种解决方案,遍历表达式,遇到数字存栈,遇到运算符则进行计算并将结果压栈,最终栈顶元素即为运算结果。代码示例展示了如何处理加、减、乘、除四种运算。
3588

被折叠的 条评论
为什么被折叠?



