1 importjava.util.ArrayList;2 importjava.util.Deque;3 importjava.util.LinkedList;4 importjava.util.List;5
6 public classMain {7 public static voidmain(String[] args) {8 String str ="11+(2*4)+3*(61-1)";//结果为11+8+180=1999 //将字符串转成list
10 List List =toInfixExpressionList(str);11 System.out.println(List);12 //中缀表达式转后缀表达式
13 List suffixList =prefixToSuffix(List);14 System.out.println(suffixList);15 //计算后缀表达式的结果
16 System.out.println("后缀表达式的计算结果为:"+toCalculation(suffixList));17 }18
19 /**
20 * 将表达式每一个部分转换成list21 *@paramstr 计算表达式22 *@returnList23 */
24 public static ListtoInfixExpressionList(String str){25 List list = new ArrayList<>(str.length());26 int i = 0;//用于遍历表达式的指针
27 char c;//用于存储每一个遍历到的字符
28 StringBuilder s;//用于多位数的拼接
29 while (i
32 if(c < 48 || c > 57){33 list.add(""+c);34 i++;35 }else{36 s = newStringBuilder();37 while (c >= 48 && c <= 57){38 s.append(c);39 i++;40 c =str.charAt(i);41 }42 list.add(s.toString());43 }44 }45 returnlist;46 }47
48 /**
49 * 计算后缀表达式50 *@return计算结果51 */
52 public static Integer toCalculation(Listlist){53 Deque stack = new LinkedList<>();54 for(String item: list){55 if(isNumeric(item)){56 stack.push(item);57 }else{58 int x =Integer.parseInt(stack.pop());59 int y =Integer.parseInt(stack.pop());60 switch(item){61 case "+":62 stack.push((y+x)+"");63 break;64 case "-":65 stack.push((y-x)+"");66 break;67 case "*":68 stack.push((y*x)+"");69 break;70 case "/":71 stack.push((y/x)+"");72 break;73 default:74 throw new RuntimeException("输入错误!");75 }76 }77 }78 returnInteger.parseInt(stack.pop());79 }80
81 /**
82 * 中缀表达式转后缀表达式83 *@returnList84 */
85 public static List prefixToSuffix(Listlist){86 //初始化两个栈,stack1为数栈,stack2为操作符栈
87 List stack1 = new ArrayList<>();88 Deque stack2 = new LinkedList<>();89 for(String item: list){90 if(isNumeric(item)){91 //数字直接入栈
92 stack1.add(item);93 }else if(item.equals("(")) {94 //左括号或者空直接入栈
95 stack2.push(item);96 }else if(item.equals(")")){97 //右括号将符号栈中左括号前的所有符号入数栈
98 while (!stack2.peek().equals("(")){99 stack1.add(stack2.pop());100 }101 stack2.pop();//清除括号
102 }else if(stack2.peek()==null||judgePriority(item)>judgePriority(stack2.peek())){103 //优先级比栈顶元素高,直接入栈
104 stack2.push(item);105 }else{106 //优先级比栈顶元素低或者相等,将栈顶优先级高的入数栈
107 while (stack2.peek()!=null&&judgePriority(stack2.peek())<=judgePriority(item)){108 stack1.add(stack2.pop());109 }110 stack2.push(item);111 }112 }113 while (stack2.peek()!=null){114 stack1.add(stack2.pop());115 }116
117 returnstack1;118 }119
120 /**
121 * 返回运算符优先级,加减为1,乘除为2122 *@paramstr 运算符123 *@return优先级124 */
125 public static intjudgePriority(String str){126 switch(str){127 case "+":128 return 1;129 case "-":130 return 1;131 case "*":132 return 2;133 case "/":134 return 2;135 case "(":136 return 0;137 case ")":138 return 0;139 default:140 throw new RuntimeException("输入有误!"+str);141 }142 }143
144 /**
145 * 判断字符串是否是正整数146 *@paramstr 字符串147 *@returnboolean148 */
149 public static booleanisNumeric(String str){150 for (int i = str.length();--i>=0;){151 if (!Character.isDigit(str.charAt(i))){152 return false;153 }154 }155 return true;156 }157 }