一、前缀、中缀、后缀表达式
概念:对于字符串表达式(3+4)x5-6,有:
1.前缀表达式(波兰表达式):- x + 3 4 5 6 ——从右至左扫描,遇到数字时,压入栈,遇到运算符,弹出栈顶的两个元素,用运算符对它们做相应的计算,并将结果入栈。
2.中缀表达式:(3+4)x5-6 ——需要判断遇到的运算符的优先级
3.后缀表达式(逆波兰表达式):3 4 + 5 x 6 - ——从左至右扫描,遇到数字时,将压入栈,遇到运算符,弹出栈顶的两个元素,用运算符对它们做相应的计算,并将结果入栈。
二、逆波兰表达式计算器
输入一个逆波兰表达式(后缀表达式),使用栈,计算器结果。
LeetCode150:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
import java.util.*;
public class Solution {
public static int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(int i=0;i<tokens.length;i++){
switch(tokens[i]){
case "+":
stack.push(stack.pop()+stack.pop());
break;
case "-":
int temp = stack.pop();
stack.push(stack.pop()-temp);
break;
case "*":
stack.push(stack.pop()*stack.pop());
break;
case "/":
int div = stack.pop();
stack.push(stack.pop()/div);
break;
default:
stack.push(Integer.parseInt(tokens[i]));
break;
}
}
return stack.pop();
}
public static void main(String[] args) {
String[] tokens = {"2", "1", "+", "3", "*"};
System.out.println(evalRPN(tokens));
}
}
如果输入的是一个字符串表达式,则只需转换为字符串数组即可:
public static void main(String[] args) {
String s = "3 4 + 5 * 6 -";
String[] tokens = s.split(" ");
System.out.println(evalRPN(tokens));
}