目录
中缀和后缀表达式的含义
我们平时使用的数学运算表达式就称做中缀表达式。
而后缀表达式是一种没有括号的表达式,它将运算符号后置。
示例:
四则表达式:9+(3-1)x3+10÷2
后缀表达式:9 3 1 - 3 x + 10 2 / +
使用后缀表达式的原因
由于早年的计算机没有括号来规定四则运算的运算顺序,因此为了服务于计算机的计算,波兰逻辑学家Jan Lukasiewicz就发明了后缀表达式,同时,这样的表达式也被称为逆波兰表达式,大家如果在一些题目或博客中看到这样的说法就不要感到疑惑啦。
后缀表达式的计算方法(栈)
在了解后缀表达式的计算方法之前,我们需要引入一种数据结构 ---- 栈。
栈是一种先进后出的数据结构,它可以很好地解决这个问题,具体形式可以见下图:

我们按顺序将数字压入栈,遇到运算符,如“+”、“-”、“/”、“*”时,将栈顶前两个元素取出并进行运算,再将得到的结果数字压入栈,一直循环,直到表达式结束,将最后的运算结果压出就是运算式的结果。
相关题目
逆波兰表达式求值 https://leetcode.cn/problems/8Zf90G/description/
思路:此题含义便是我们上面后缀表达式的计算方式,只要我们了解了,通过栈的数据结构这题就变得迎刃而解了!
答案:
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(!isOperation(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 isOperation(String s){
if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")){
return true;
}
return false;
}
}
本文介绍了中缀表达式与后缀表达式的概念,着重讲解了后缀表达式用于早期计算机计算的原因,并通过栈数据结构展示了其计算方法,最后以LeetCode题目为例演示逆波兰表达式求值的过程。
2259





