使用栈实现中缀表达式转为后缀表达式和后缀表达式的求解
书籍在线网址http://interactivepython.org/runestone/static/pythonds/index.html
中文翻译书籍:https://facert.gitbooks.io/python-data-structure-cn/
将中缀表达式转换为后缀表达式
中缀表达式(上图,一般书写)转换为后缀表达式(ABC*+)
方法:
- 创建一个名为 opstack 的空栈以保存运算符。给输出创建一个空列表。
- 通过使用字符串方法拆分将输入的中缀字符串转换为标记列表。
- 从左到右扫描标记列表。
- 如果标记是操作数,将其附加到输出列表的末尾。
- 如果标记是左括号,将其压到 opstack 上。
- 如果标记是右括号,则弹出 opstack,直到删除相应的左括号。将每个运算符附加到输出列表的末尾。
- 如果标记是运算符,
*,/,+
或-
,将其压入 opstack。但是,首先删除已经在 opstack 中具有更高或相等优先级的任何运算符,并将它们加到输出列表中。
- 当输入表达式被完全处理时,检查 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 * +求值
方法:
- 创建一个名为
operandStack
的空栈。 - 拆分字符串转换为标记列表。
- 从左到右扫描标记列表。
- 如果标记是操作数,将其从字符串转换为整数,并将值压到operandStack。
- 如果标记是运算符
*,/,+
或-
,它将需要两个操作数。弹出operandStack 两次。 第一个弹出的是第二个操作数,第二个弹出的是第一个操作数。执行算术运算后,将结果压到操作数栈中。
- 当输入的表达式被完全处理后,结果就在栈上,弹出 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
使用栈实现中缀表达式转为后缀表达式和后缀表达式的求解相关推荐
- 九、中缀表达式转为后缀表达式
使用栈将中缀表达式转为后缀表达式并计算 一.中缀表达式转换为后缀表达式 由于后缀表达式适合计算式进行计算,但是人对于较长的中缀表达式,很难将中缀表达式直接转换为后缀表达式,于是我们使用栈来实现中缀表达 ...
- 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)
栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...
- 使用栈实现中缀表达式转换成后缀表达式并计算结果(逆波兰计算器)
一.中缀表达式转换成后缀表达式 具体步骤如下: 1.初始化栈stack(暂时存放运算符)以及集合list(存放后缀表达式) 2.从左向右扫描中缀表达式 3.当前元素为数字时,直接添加到list中 4. ...
- 顺序栈计算器 中缀转后缀表达式
顺序栈计算器 中缀转后缀表达式 前言 一.后缀表达式简述 二.参考书目中的函数实现 1.输入一个后缀表达式并计算 2.将中缀转后缀表达式 三.在原方法基础上改写并结合两个方法 1.输入一个后缀表达式并 ...
- 利用栈将中缀表达式转化成后缀表达式
目的:将中缀表达式(即标准形式的表达式)转换为后缀式. 例子:a+b*c+(d*e+f)*g转换成abc*+de*f+g*+ 转换原则 1. 遇到操作数, 直接输出 2. 操作符的优先级为 () 最大 ...
- java简易计算机(用栈实现中缀转后缀,计算后缀表达式)
这学期java课的一个小作业,用java编一个小计算器. 个人认为要点在于: 1.计算机的布局,即按钮和输出框的布局需要知道怎么操作,按钮的大小和字体的大小颜色.不同布局中按钮的改变大小等等 2.用栈 ...
- Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现
1.堆栈-Stack 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- 前缀(波兰表达式) 中缀 后缀(逆波兰表达式)
前缀.中缀.后缀表达式(逆波兰表达式) 本文转自https://www.cnblogs.com/chensongxian/p/7059802.html 介绍 前缀表达式.中缀表达式.后缀表达式都是四则 ...
- 线性栈实现中缀表达式计算器
前缀表达式转后缀表达式,及后缀表达式计算器 线性栈实现中缀表达式计算器 空格插入和弹栈计算 总体源代码 线性栈实现中缀表达式计算器 方法代码: 以(10+20/2*3)/2+8为例(计算结果为28): ...
- 数据结构:用栈实现中缀表达式的求值(文字描述+详细步骤示例)
用栈实现中缀表达式的求值 步骤: 从左到右扫描,如果扫描到的运算符优先级大于栈顶运算符优先级,则入栈,否则,出栈并运算. 如果遇到右括号,一直出栈,直到遇到左括号为止.并且每一次出栈的运算符都要做一次 ...
最新文章
- 深度解析使用CSS单位px、em、rem、vh、vw、vmin、vmax实现页面布局
- java 视频预览_java在上传视频时生成预览图
- [LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历
- 介绍几款开源好用的产品
- 牛客网 在线编程 局部最小值位置
- 第六次课作业(质量管理、项目人力资源管理)
- 在Javascript中实现伪哈希表
- 修改el-popover和el-select样式
- c语言删除结点,C语言在链表中删除结点
- flask创建虚拟环境
- string.Empty与,null的区别
- android中jni的调用过程,android JNI学习② JNI调用过程
- Spotfire 表达式之日期和时间函数
- win10系统网卡驱动异常,错误代码56
- 程序员有文化,多可怕!
- 应对CentOS 停服,麒麟信安迁移方案已就绪
- DuckDuckGo
- 小马哥-----高仿苹果6s plus刷机拆机主板型号Q39主板图与开机界面图 分版本
- OpenCV学习Rosenfeld细化算法
- 常量和常变量(const)