packagedatastructure.stack;import java.util.*;/***
netty_lecture
*
逆波兰计算器
* 1+((2+3)*4)-5 ==> 1 2 3 + 4 * + 5 1
*@author: myron
* @date : 2020-03-18 23:48
**/
public classPolandNotation {private static final int MINAS = 0;private static final int PLUS = 0;private static final int MULTI = 1;private static final int DIV = 1;public static voidmain(String[] args){
String expression= "1,+,(,(,200,+,3,),*,9,),-,5";
List list =middleExpressionToList(expression);
List suffixExp =middleExpToSuffixExp(list);
System.out.println("中缀表达式:"+list);
System.out.println("后缀表达式:" +suffixExp);int result =calculate(suffixExp);
System.out.println("结果为:" +result);
}/*** 中缀表达式转List
*@paramexpression
*@return
*/
public static ListmiddleExpressionToList(String expression){
String[] split= expression.split(",");
List list =Arrays.asList(split);returnlist;
}/*** 中缀表达式转后缀表达式list
*@parammiddleExpList
*@return
*/
public static List middleExpToSuffixExp(ListmiddleExpList){
Stack s1 = new Stack<>();
List s2 = new ArrayList<>();for(String oper:middleExpList){int priority =getPriority(oper);if(oper.matches("\\d+")){
s2.add(oper);
}else if("(".equals(oper)) {
s1.push(oper);
}else if(")".equals(oper)){while(!"(".equals(s1.peek())){
s2.add(s1.pop());
}
s1.pop();
}else{while(s1.size() != 0 && priority <=getPriority(s1.peek())){
s2.add(s1.pop());
}
s1.push(oper);
}
}while(s1.size() != 0){
s2.add(s1.pop());
}returns2;
}/*** 计算方法
*@paramlist :后缀表达式
*@return
*/
public static int calculate(Listlist){//创建栈
Stack stack = new Stack<>();//遍历表达式list
for(String str: list){/**正则匹配,是数字,入栈*/
if(str.matches("\\d+")){
stack.push(str);/**运算符,则弹出两位数,进行运算*/}else{int num1 =Integer.parseInt(stack.pop());int num2 =Integer.parseInt(stack.pop());int result = 0;if(str.equals("+")){
result= num1 +num2;
}else if(str.equals("-")){
result= num2 -num1;
}else if(str.equals("*")){
result= num1 *num2;
}else if(str.equals("/")){
result= num2/num1;
}else{throw new RuntimeException("不支持该符号!");
}//预算结果入栈
stack.push(result + "");
}
}//返回运算结果
returnInteger.parseInt(stack.pop());
}/*** 获取符号的优先级*/
public static intgetPriority(String oper){if (oper.equals("+")) {returnPLUS;
}else if(oper.equals("-")){returnMINAS;
}else if(oper.equals("*")){returnMULTI;
}else if(oper.equals("/")){returnDIV;
}return -1;
}
}