数据结构之栈三 后缀表达式运算
一、 后缀表达式是什么?
逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)
例如:
中缀表达式:3+3*(2+4)-4/2
转化为后缀表达式为:3 3 2 4 + * + 4 2 / -
二、计算步骤
1.将计算的字符串的后缀表达式转化为数组,利于后续的遍历
2.定义一个栈,遍历1中得到的数组,数字入栈,遇到字符,取出栈顶和次顶元素进行运算,并将运算结果入栈
三、代码实现
package demo.sjjg.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
//后缀表达式运算(逆波兰表达式运算)
public class PolandNotation {
public static void main(String[] args) {
// String value="3 6 2 / + 5 + 4 5 * -";//3+6/2+5-4*5=-9
// String value = "3 4 * 8 - 4 2 / +";//3*4-8+4/2=6
String value="3 3 2 4 + * + 4 2 / -";//3+3*(2+4)-4/2=19
List<String> list = getListString(value);
System.out.println("list=" + list);
int res=calculate(list);
System.out.println("结果为:"+res);
}
//将字符串转化为list数组利于遍历
private static List<String> getListString(String value) {
String[] s = value.split(" ");
ArrayList<String> list = new ArrayList<>();
for (String emp:s){
list.add(emp);
}
return list;
}
//计算
private static int calculate(List<String> list) {
Stack<String> stack = new Stack<>();
for (String emp:list){
if (emp.matches("\\d+")){
stack.push(emp);
}else {
int num1= Integer.parseInt(stack.pop());
int num2= Integer.parseInt(stack.pop());
int res=0;
if (emp.equals("+")){
res=num1+num2;
}else if (emp.equals("-")){
res=num2-num1;
}else if (emp.equals("*")){
res=num2*num1;
}else if (emp.equals("/")){
res=num2/num1;
}
stack.push(""+res);
}
}
return Integer.parseInt(stack.pop());
}
}
四、结果实现
总结
本次我们实现了后缀表达式的运算,小伙伴们是不是很好奇那个那个中缀表达式怎样变成后缀表达式啊。小伙伴别着急,带小括号运算和中缀表达式转后缀表达式我们下篇再见。