码迷,mamicode.com
首页 > 其他好文 > 详细

9、栈-逆波兰计算器(输入为逆波兰表达式)

时间:2020-06-17 20:23:38      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:简单的   计算器   alc   com   col   als   item   str   new   

来源:https://www.bilibili.com/video/BV1B4411H76f?p=36

一、前缀表达式、中缀表达式、后缀表达式(逆波兰表达式)

前缀表达式:又叫波兰式,它的运算符位于数据前面,例如:− × + 3 4 5 6。计算机对其进行运算时从右到左扫描入栈,遇到运算符时弹出数据,利用运算符进行计算,得到的数据再次入栈,如此循环。

中缀表达式:就是我们常见的表达式,上面的前缀表达式对应的中缀表达式为:(3+4)× 5 − 6,这对计算机的运算来说不太好操作。

后缀表达式:又叫逆波兰表达式,运算符位于数据后面,上面的式子对应的后缀表达式为:3 4 + 5 × 6 -

 

这里我们先实现一个简单的,输入为现成的后缀表达式,得到输出结果。即按照从左到右的顺序进行:【遇到数据入栈,遇到符号计算,得到结果继续入栈的循环操作】

二、实现

 1     public static void main(String[] args) {
 2         String suffixException = "30 4 + 5 * 6 -";
 3 
 4         List<String> array = getArray(suffixException);
 5         System.out.println(array);
 6 
 7         int res = calculate(array);
 8         System.out.println(res);
 9     }
10 
11     //将字符串转为数组的形式
12     public static List<String> getArray(String suffixException){
13         String[] split = suffixException.split(" ");
14 
15         List<String> list = new ArrayList<>();
16 
17         for (String s : split) {
18             list.add(s);
19         }
20         return list;
21     }
22 
23     //计算逆波兰表达式
24     public static int calculate(List<String> ls){
25         Stack<String> stack = new Stack<>();
26         for (String item : ls) {
27             //用matches方法判断取出来的内容是否匹配对应的正则表达式(\\d+),即匹配的是一个多位数
28             if(item.matches("\\d+")){
29                 stack.push(item);//是数字就入栈
30             }else {
31                 int num1 = Integer.parseInt(stack.pop());
32                 int num2 = Integer.parseInt(stack.pop());
33                 int res = 0;
34                 if(item.equals("+")){
35                     res = num2 + num1;
36                 }else if(item.equals("-")){
37                     res = num2 - num1;
38                 }else if(item.equals("*")){
39                     res = num2 * num1;
40                 }else if(item.equals("/")){
41                     res = num2 / num1;
42                 }else {
43                     throw new RuntimeException("运算符错误:"+item);
44                 }
45                 stack.push(""+res);//计算完成,转为字符串,入栈
46             }
47         }
48         return Integer.parseInt(stack.pop());//最后留在栈中的就是结果
49     }

结果

[30, 4, +, 5, *, 6, -]
164

这里我们手动输入了逆波兰表达式,正确的姿势应该是将中缀表达式转换成逆波兰表达式,之后进行计算。

9、栈-逆波兰计算器(输入为逆波兰表达式)

标签:简单的   计算器   alc   com   col   als   item   str   new   

原文地址:https://www.cnblogs.com/zhao-xin/p/13154249.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!