使用栈实现中缀表达式转为后缀表达式和后缀表达式的求解

 

书籍在线网址http://interactivepython.org/runestone/static/pythonds/index.html

 

中文翻译书籍:https://facert.gitbooks.io/python-data-structure-cn/

 

 

将中缀表达式转换为后缀表达式


            中缀表达式(上图,一般书写)转换为后缀表达式(ABC*+)

 

 

方法:

  1. 创建一个名为 opstack 的空栈以保存运算符。给输出创建一个空列表。
  2. 通过使用字符串方法拆分将输入的中缀字符串转换为标记列表。
  3. 从左到右扫描标记列表。
    • 如果标记是操作数,将其附加到输出列表的末尾。
    • 如果标记是左括号,将其压到 opstack 上。
    • 如果标记是右括号,则弹出 opstack,直到删除相应的左括号。将每个运算符附加到输出列表的末尾。
    • 如果标记是运算符,*,/,+或 - ,将其压入 opstack。但是,首先删除已经在 opstack 中具有更高或相等优先级的任何运算符,并将它们加到输出列表中。
  4. 当输入表达式被完全处理时,检查 opstack。仍然在栈上的任何运算符都可以删除并加到输出列表的末尾

 

使用字典来保存操作符优先级,这个字典将每个运算符映射到一个整数,可以与其他运算符的优先级(我们使用整数3,2和1)进行比较。左括号将赋予最低的值。这样,与其进行比较的任何运算符将具有更高的优先级

 1 #coding:utf8
 2 from stack import Stack
 3 def infixToPostfix(infixexpr):
 4     prec = {}
 5     prec["*"] = 3
 6     prec["/"] = 3
 7     prec["+"] = 2
 8     prec["-"] = 2
 9     prec["("] = 1
10     opStack = Stack()
11     postfixList = []       #创建后缀输出列表
12     tokenList = infixexpr.split()   #将中缀列表转换为字符串
13 
14     for token in tokenList:
15         #如果标记是操作数,将其附加到输出列表末尾
16         if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token in "0123456789":
17             postfixList.append(token)
18 #如果标记是左括号,将其压栈 19 elif token == '(': 20 opStack.push(token)
21 #如果标记是右括号,弹栈添加到输出列表末尾直到遇到左括号 22 elif token == ')': 23 topToken = opStack.pop() 24 while topToken != '(': 25 postfixList.append(topToken) 26 topToken = opStack.pop()
27 #如果标记是运算符,删除已经在栈中具有更高或相等优先级的任何运算符并添加到输出列表末尾,再压栈 28 else: 29 while (not opStack.isEmpty()) and (prec[opStack.peek()] >= prec[token]): 30 postfixList.append(opStack.pop()) 31 opStack.push(token) 32 33 while not opStack.isEmpty():    #输入表达式完全处理后将栈中剩下内容添加到输出列表末尾 34 postfixList.append(opStack.pop()) 35 return " ".join(postfixList) #列表转字符串 36 37 print(infixToPostfix("A * B + C * D")) 38 print(infixToPostfix("( A + B ) * C - ( D - E ) * ( F + G )"))

   #A B * C D * +
   #A B + C * D E - F G + * -

 

 

后缀表达式求值

对后缀表达式4 5 6 * +求值

 

 

方法: 

 

  1. 创建一个名为 operandStack 的空栈。
  2. 拆分字符串转换为标记列表。
  3. 从左到右扫描标记列表。
    • 如果标记是操作数,将其从字符串转换为整数,并将值压到operandStack。
    • 如果标记是运算符*,/,+-,它将需要两个操作数。弹出operandStack 两次。 第一个弹出的是第二个操作数,第二个弹出的是第一个操作数。执行算术运算后,将结果压到操作数栈中。
  4. 当输入的表达式被完全处理后,结果就在栈上,弹出 operandStack 并返回值。
 1 from stack import Stack
 2 def postfixEval(postfixExpr):
 3     operandStack=Stack()
 4     tokenList=postfixExpr.split()       #根据空格分隔字符串返回列表
 5     print(tokenList)
 6     #['7', '8', '+', '3', '2', '+', '/']
 7 
 8     for token in tokenList:
 9         if token in "0123456789":
10             operandStack.push(int(token))
11         else:
12             operand2=operandStack.pop()
13             operand1=operandStack.pop()
14             result=doMath(token,operand1,operand2)
15             operandStack.push(result)
16     return operandStack.pop()
17 
18 def doMath(op,op1,op2):
19     if op=="*":
20         return op1*op2
21     elif op=='/':
22         return op1/op2
23     elif op=="+":
24         return op1+op2
25     else:
26         return op1-op2
27 
28 print(postfixEval('7 8 + 3 2 + /'))
29 
30 #['7', '8', '+', '3', '2', '+', '/']
31 #3.0

 

转载于:https://www.cnblogs.com/xiongxueqi/p/8612085.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TQ210 —— 点亮LED

TQ210 —— 点亮LED 1、S5PV210 GPIO硬件简介 1.1、GPIO 【S5PV210有237个多功能IO口,通过设置寄存器确定某个引脚用于输入输出或者其他特殊功能】 GPIO的英文全称为General-PurposeIO ports,也就是通用IO接口。在嵌入式系统中常常有数量众多&#xff0…

拆解镍氢电池充电器,简单的电路设计令人震惊!

上班爱摸鱼,下班爱钓鱼,于是买了一个钓鱼机。不贵,几十块钱,带4条鱼竿。长这样:电池驱动,钓起鱼来乐趣无穷:惊喜的是,钓鱼机自带附赠的电池是可充电的,省下不少买干电池的…

设备底座几个常见固定方式

在运营商我们可以经常发现如下的固定方式,因为设备厂家的不同,以及机房上下走线方式,固定方式也有些差异。可以清楚看见,底座可以靠螺母进行微调使机柜高度,底部还有膨胀螺丝打入地板还有很多机柜是不加微调用的底座&a…

抽35块树莓派新品单片机送给可爱的你们

我是谁~公众号「嵌入式Linux」,深入解析简明扼要直白解释各种技术问题,包括但不局限于Linux、单片机、半导体、Android、C语言等等。号主从事嵌入式软件行业有10余年,建立了10余个技术微信群,整理了很多技术资料,欢迎大…

TQ210——时钟系统

TQ210——时钟系统 1、时钟域 一般来讲, MCU 的主时钟来源主要是外部晶振或外部时钟,比较常见的是 外 部晶振。一般情况,系统内所使用的时钟都是高频率的时钟,外部晶振一般达不到那么高的频率,所以一般使用锁相环电路&…

我的文章汇总

2018年文章汇总2019年文章汇总2020年文章汇总专辑|Linux文章汇总专辑|程序人生专辑|C语言专辑|Git专辑|安卓系统专辑|嵌入式我的知识小密圈关注公众号,后台回复「1024」获取学习资料网盘链接。欢迎点赞,关注,转发,在看&#xff0c…

webpack-安装

以前配置的gulpfile.js,随着版本的迭代更新,现在已经... 1.安装webpack npm i -g webpack-cli && npm i -g babel-preset-env 2.弹射出窗口(我们未安装Git,或者未找到Git path,请配置path) 3.再次执…

TQ210——S5PV210中断体系

TQ210——S5PV210中断体系 中断是指 CPU 在执行程序的过程中,遇到异常情况需要处理, CPU停 止当前程序的运行,保存当前程序运行处的必要参数,转去处理这些异常情况, 处理结束后再返回当前程序的间断处,继续…

高通骁龙888开始被Linux内核5.12版正式支持

在Linux 5.12内核合并窗口中,有很多新的硬件开始被支持,其中不乏一些知名产品例如高通骁龙888,除此之外还有一些与ARM平台和设备树有关的代码添加。来自Arnd Bergmann的各种内核拉取请求在周六晚上被合并,此前由于恶劣的冬季风暴阻…

Python实现比较两个列表(list)范围

Python实现比较两个列表(list)范围 有一道题: 比较两个列表范围,如果包含的话,返回TRUE,否则FALSE。 详细题目如下: Create a function, this function receives two lists as parameters, each list indicates a scop…

单片机里面的CPU使用率是什么鬼?

打开电脑的任务管理器,看着跳动的CPU使用率,发现很舒服。每一个线程占用了多少CPU清清楚楚,也就能针对性的确认为啥你的电脑跑的慢了。今天这篇笔记不讲每个任务(或线程)CPU的使用情况,而是单片机整体的CPU…

图解,C语言希尔排序

希尔排序和插入排序很相似,有点像插入排序的升级版本。希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序&…

TQ210——S5PV210串口通信

TQ210——S5PV210串口通信 1、 串行与并行通信 串行通道中,有效信息被编码后串行的从单根传输线上传送出去。譬如发送ASCII字符’a’,我们可以将’a’对应的ASCII码97(0x61)分作8个bit在传输线上顺序依次传输。 与串行传输相对应…

暴力字符匹配算法的C语言实现

1、聊一聊今天跟大家分享的这个曲子一般是在天气预报和英语试听中出现,不信你听一听绝对有种似曾相识感觉。本篇文章主要是为讲解高效字符匹配算法的一则预告文,跟大家讲讲暴力字符匹配算法以及匹配算法在通信中如何使用。2、暴力匹配算法介绍1聊聊字符匹…

TQ210 —— LCD

TQ210 —— LCD一、LCD控制器1、S5PV210 LCD控制器要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是…

微信表情都戒烟了

昨天看到最新的微信表情是这样的原来的抽烟表情被替换成了这释放出一个信号,就是「抽烟不酷了」不过我想说,只戴着一个绿帽子,嘴巴里面什么都没有,好像也不酷啊。难道重点就是那个墨镜?????不过,在PC版…

Python 类的属性和实例属性 Python 的动态语言

#定义一下类, 含有类属性 aaa, >>> class Aa: ... aaa 10... #对类 Aa实例化出一个实例 a1>>> a1 Aa() >>> print(a1.__dict__)#查看实例并没有自己的方法和属性{}>>> a1.aaa #但是这个实例在调用属性的时候, 发现自己没有这个属性, 于…

高效KMP字符匹配算法就这么简单

1、聊一聊上一篇文章"暴力"字符匹配算法的C语言实现2、KMP算法介绍1KMP介绍KMP是一种字符匹配算法,为啥叫KMP呢?因为是由D.E.Knuth,J.H.Morris和V.R.Pratt大佬提出来的。那一些小伙伴会问了怎么不叫"DJV算法"呢?因为老外…

TQ210 —— NandFlash

TQ210 —— nandflashTQ210 开发板板载一片 1Gbyte 的 NAND FLASH——K9K8G08U0B,通过查询K9K8G08U0B 芯片手册可以得到如下信息:(理论知识不再介绍)K9K8G08U0B : (1G 32M) x 8bit 总大小Data Register : (2K 64) x 8bit 数据寄…

涂鸦赞助的500个开发套件,先到先得

来源 | 涂鸦跟涂鸦申请的福利,给喜欢开发的同学发放开发套件,只要是不是专门白嫖党,数量可以不做限制。去年疫情突发,封城、封小区以及人员隔离,让原本享受千般宠爱的主子们变成了靠吃猫砂、塑料袋度日的小可怜&#x…