逆波兰表达式又称为后缀表达式,代表的含义是操作数在前,运算符在后。
比如:1+2,用逆波兰表达式来写的话,就是12+。
而1+2这种写法称为中缀表达式,即运算符在两个操作数之间,也是我们平常最常采用的写法。
中缀表达式 | 逆波兰表达式 |
---|---|
A+B | AB+ |
A*B | AB* |
– | – |
A+B*C | ABC*+ |
A*(B+C) | ABC*+ |
– | – |
逆波兰表达式的优点是可以把复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。
只用两种简单操作: 入栈和出栈,就可以搞定任何普通表达式的运算。
逆波兰式的求解过程可以用栈来实现。为了便于理解,举一个带数值的例子:
计算:1 + 2 * 3 + ( 4 * 5 +6 ) * 7 = ?
https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack=new Stack<>();
for(String s:tokens){
if(!isO(s)){
//数字 字符
//用parseInt
stack.push(Integer.parseInt(s));
}
else{
//运算符
int num2=stack.pop();
int num1=stack.pop();//因为先出栈的是放运算符的右边,所以num1和num2的顺序很重要
switch(s) {
case "+":
stack.push(num1 + num2);
break;
case "-":
stack.push(num1 - num2);
break;
case "*":
stack.push(num1 * num2);
break;
case "/":
stack.push(num1 / num2);
break;
}
}
}
return stack.pop();
}
//判断是否为运算符---isO
private boolean isO(String s) {
if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {
return true;
}
return false;
}
感谢阅读!