什么是逆波兰表达式?
答:逆波兰表达式的计算不需要括号和依赖于运算符的优先级法则,只需要依据从左到右扫描表达式并遵循“遇到数字则压栈,遇到运算符则弹出栈顶所需数量的操作数进行运算,然后将结果压回栈中”的原则。
那我们先来看一个例子把!
中缀表达式 : 2+(3*5)
后缀表达式 : 235*+
看到这里想必很多小伙伴都蒙了吧,那就让我们继续往下看吧
让我们来解释一下每一步吧,首先这个遵循从左往右,先乘除后加减的原则,因为 * 的两边已经有括号了,所以不需要加括号,然后从左往右,遇到第一个运算符 “+” ,把 + 左右两边的表达式或数值用括号括起来,然后把对应的运算符挪到本括号的外边(注意是右边),最后把所有的括号删除即可
很好,你已经学会了前缀转后缀了
那究竟为什么可以这样算呢?那这样算的结果和最初的结果一样吗?让我们来一探究竟吧!
首先我们先申请一个栈,我们知道栈是遵循先进后出的原则,我们从最左边开始往后找
- 如果碰到了数值,那么把它放入栈中
- 如果碰到了运算符,那么把运算符单独拿出来,接着把 运算符单独拿出来
- 把运算符拿出来之后继续从栈中依次取出两个元素,最上面的元素放到运算符的右边,倒数第二个放到运算符的左边,注意,这里顺序不能乱,把运算之后的结果再一次放入栈中,然后重复,直到算出结果
很好,你已经学会如何运算了,那么我们来尝试一道练习题吧!
我们按照对应的位置分别进行从1~7的赋值
即a = 1 , b = 2 , c = 3 , d = 4 , e = 5 , f = 6 , g = 7
1 + 2 * 3 +(4 * 5 + 6) * 7 = 189
abc*+de*f+g*+ = ?
让我来解释一下吧!
- 2*3的结果是6
- 6+1的结果是7
- 4*5的结果是20
- 6+20的结果是26
- 26*7的结果是182
- 182+7的结果是189
- 如果还有不懂的建议自己画图理解一下,非常的简单
下面是一个练习:
下面是我写的一个java代码,仅供参考
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(int i = 0;i<tokens.length;i++){
String tmp = tokens[i];
if(!isOpearation(tmp)){
Integer val = Integer.valueOf(tmp);
stack.push(val);
} else {
Integer val2 = stack.pop();
Integer val1 = stack.pop();
switch(tmp){
case "+":
stack.push(val1+val2);
break;
case "-":
stack.push(val1-val2);
break;
case "*":
stack.push(val1*val2);
break;
case "/":
stack.push(val1/val2);
break;
}
}
}
return stack.pop();
}
public boolean isOpearation(String s){
if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")){
return true;
}
return false;
}
}