10--栈计算器(补充:前缀、中缀、后缀表达式规则;逆波兰表达式计算器)

一、前缀表达式【波兰表达式】

  1. 前缀表达式也称为波兰表达式,其特点是运算符位于操作数之前
  2. 举例说明:(3+4)*5-6 对应的前缀表达式就是:- * + 3 4 5 6

前缀表达式的计算机求值:

从右至左扫描表达式,遇到数字时,将数字压入堆栈中,遇到运算符,弹出来栈顶的2个数,用运算符对他们做相应的运算(栈顶元素和次顶元素),并将结果入栈,重复上述过程直到表达式最左端,最后运算得出的值即为表达式的值,例如(3+4)*5-6 对应的前缀表达式就是:- * + 3 4 5 6,针对前缀表达式求值步骤如下:

  1. 从右至左扫描,将6、5、4、3压入堆栈
  2. 遇到 + 运算符,因此弹出3(栈顶元素)、4(次顶元素),计算出3+4=7,将7入栈
  3. 接下来是 * 运算符,因此弹出7和5,计算出7*5=35,将35入栈
  4. 最后是 - 运算符,计算出 35 - 6 = 29【先弹出来的 - 后弹出来的】,将29入栈 

二、中缀表达式:

  1. 中缀表达式就是我们常见的表达式:如(3+4)*5-6
  2. 中缀表达式的求值是我们最熟悉的,但是对于计算机来说并不好操作,因此,在计算结果时,往往会将中缀表达式转成其它表达式来操作【一般转成后缀表达式】

三、后缀表达式:

  1. 后缀表达式又称为逆波兰表达式,与前缀表达式相似,知识运算符位于操作数之后
  2. 举例说明:(3+4)*5-6 对应的后缀表达式就是:3  4 + 5 * 6 -

后缀表达式计算机求值:

从左至右扫描表达式,遇到数字时,将数字压入栈中,遇到运算符时,弹出栈顶的2个数(栈顶和次顶元素),用运算符将其运算,将其结果压入到栈中,重复上述过程直到表达式的最右端,最后运算出的值即为表达式的值,例如(3+4)*5-6 对应的后缀表达式就是:3  4 + 5 * 6 -,针对其后缀表达式求值的步骤如下:

  1. 从左至右扫描,依次将3、4压入到栈中
  2. 遇到 + 号,弹出4、3,计算3+4=7,将7压入栈中
  3. 将5压入到栈中
  4. 遇到 * 号,弹出5、7,计算5*7=35,将35压入栈中
  5. 将6压入栈中
  6. 最后遇到 - 号,弹出6、35,计算35-6=29,将29压入栈中即为表达式的最终结果

 

案例:完成逆波兰表达式,要求完成如下任务:

  1. 输入一个逆波兰表达式,使用栈(Stack)计算其结果
  2. 支持小括号和多位数整数,【由于此处讲解的是数据结构,因此对计算器进行简化,只支持对整数的计算】
 1 import java.util.ArrayList;
 2 import java.util.List;
 3 import java.util.Stack;
 4 
 5 //逆波兰表达式的计算
 6 public class NiPolandExpression {
 7 
 8     public static void main(String[] args) {
 9         //String expression = "3 4 + 5 * 6 -"; //29
10         //String expression = "30 4 + 5 * 6 -"; //164
11         //中缀:4 * 5 - 8 + 60 + 8 / 2 ==>后缀:4 5 * 8 - 60 + 8 2 / +
12         String expression = "4 5 * 8 - 60 + 8 2 / +"; //76
13         //1、将表达式转成ArrayList集合,后遍历,每遍历一个元素将压栈
14         Stack<String> stack = new Stack<>();
15         List<String> lists = getList(expression);
16         System.out.println(lists);
17         for(String ele: lists) {
18             if (ele.matches("\\d+")) { //正则表达式:表示匹配一个或者多个整数
19                 //是数字直接入栈
20                 stack.push(ele);
21             }else {
22                 //到了这里说明是符号,需要pop出2个操作数
23                 int num2 = Integer.parseInt(stack.pop());
24                 int num1 = Integer.parseInt(stack.pop());
25                 int ret = 0;
26                 switch(ele) {
27                 case "+": 
28                     ret = num1 + num2;
29                     break;
30                 case "-":
31                     ret = num1 - num2;
32                     break;
33                 case "*":
34                     ret = num1 * num2;
35                     break;
36                 case "/":
37                     ret = num1 / num2;
38                     break;
39                     }
40                 //将计算结果压入栈中
41                 stack.push(ret+"");
42             }
43         }
44         int result = Integer.parseInt(stack.pop());
45         System.out.println(expression + "最终结果为:" + result);
46     }
47     
48     public static List<String> getList(String expression){
49         java.util.List<String> lists = new ArrayList<>();
50         String[] arrays = expression.split(" ");
51         for(String ele:arrays) {
52             lists.add(ele);
53         }
54         return lists;
55      }
56     
57 }

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.wtld.cn/a/75.html

如若内容造成侵权/违法违规/事实不符,请联系方塘网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Linux快速搭建一套ADB环境

一、ADB简介 1.什么是ADB Android Debug Bridge,安卓调试桥,它借助adb.exe(Android SDK安装目录platform-tools下),用于电脑端与模拟器或者真实设备交互;使用adb命令需安装Android SDK,并配置环境变量; 2.ADB架构及组成 它是一个C/S架构的应用程序,由三部分组成:adb …

多个装饰器,执行顺序,以及自己编写响应以及请求

1.背景背景:我为啥单独写一片这个文章呢?是因为遇到好多次了我必须搞懂它!文章分三部分1.1不带参数的多个装饰器1.2带参数的装饰器1.3带参数的实例,直接拿来用2不带参数的多个装饰器‘# 编写装饰器,作为响应以及请求的校验def request_wrapper(fun):print(f"request_wr…

2022杭电多校第八场1、7、5

1001 Theramore 观察以下两种情况:以0为例,上图就是说,只要有两个连续的0,我们就可以一直把它们往前移动直到移动到首位。同理只要有两个连续的1我们就可以把它们移动到尾部。 所以可以开一个栈,顺序将字符入栈,一旦遇到连续的0或者1,就把它们删去,在首尾打下标记。 co…

Bert bert-base-uncased 模型加载

1、下载模型相关文件到本地路径 https://huggingface.co/bert-base-uncased/tree/main2、修改模型加载,注释为修改前

A层省选4

场均一题放弃 A. 我 我切题了 发现图上有环可以不停的转,让空位到我们需要的地方去,而环的具体形态并不重要,我们只需要知道环的大小(\(size\))和环内元素个数(\(cnt\))即可 所以使用\(tarjan\)缩点,然后转化为一个\(DAG\)上的问题 发现环的大小等于元素个数时,我们必须先…

fa

\[ax+by\equiv X_i \]$$\texttt{--END--}$$我的博客: $\texttt{1Liu}$ 本文链接: https://www.cnblogs.com/OLiuO/p/16589553.html 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!