java栈多位数表达式计算_【Java数据结构】中缀表达式转后缀表达式,后缀表达式的计算(多位数)...

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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值