前缀表达式(波兰表达式)
前缀表达式运算符位于操作数之前距离,(3+4)*5-6对应的前缀表达式就是-*+3456
计算机求值顺序:从右向左扫描,遇到数字压入堆栈,遇到运算符时,弹出栈顶的两个数字,用运算符对他们做出相应的计算,并将结果入栈
中缀表达式
人经常书写的,但计算机难以理解,常转换成后缀表达式(逆波兰表达式)
后缀表达式
计算机求值顺序:从左到右扫描,遇到数字压入堆栈,遇到运算符,弹出栈顶两个数,用运算符计算,并将结果入栈,重复上述的过程。(3+4)*5-6对应的后缀表达式就是34+5*6-
逆波兰表达式的代码实现
package com.atguigu.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class PolandNotation {
public static void main(String[] args) {
//完成将一个中缀表达式转成后缀表达式的功能
//说明
//1. 1+((2+3)×4)-5 => 转成 1 2 3 + 4 × + 5 –
//2. 因为直接对str 进行操作,不方便,因此 先将 "1+((2+3)×4)-5" =》 中缀的表达式对应的List
// 即 "1+((2+3)×4)-5" => ArrayList [1,+,(,(,2,+,3,),*,4,),-,5]
//3. 将得到的中缀表达式对应的List => 后缀表达式对应的List
// 即 ArrayList [1,+,(,(,2,+,3,),*,4,),-,5] =》 ArrayList [1,2,3,+,4,*,+,5,–]
String expression = "1+((2+3)*4)-5";//注意表达式
List<String> infixExpressionList = toInfixExpressionList(expression);
System.out.println("中缀表达式对应的List=" + infixExpressionList); // ArrayList [1,+,(,(,2,+,3,),*,4,),-,5]
List<String> suffixExpreesionList = parseSuffixExpreesionList(infixExpressionList);
System.out.println("后缀表达式对应的List" + suffixExpreesionList); //ArrayList [1,2,3,+,4,*,+,5,–]
System.out.printf("expression=%d", calculate(suffixExp