PKU数据结构与算法Python版--习题总结(7)--中缀表达式求值
2020-04-19 23:13
330 查看
1、题目
描述
通过把“中缀转后缀”和“后缀求值”两个算法功能集成在一起(非简单的顺序调用),实现对中缀表达式直接求值,新算法还是从左到右扫描中缀表达式,
但同时使用两个栈,一个暂存操作符,一个暂存操作数,来进行求值。
输入输出示例
输入样例1:
( 2 + 3 ) * 6 + 4 / 2
输出样例1:
32.0
输入样例2:
2 ^ 3 + 4 * 5 - 16 / 2
输出样例2:
20.0
输入样例3:
( 5 + 1 ) * 2 / 3 - 3 ^ ( 2 + 8 / 4 ) / 9 + 6
输出样例3:
1.0
2、思路
创建一个函数,接受参数为一个字符串,即一个中缀表达式,
其中每个数字或符号间由一个空格隔开;
返回一个整数,即求值的结果。(支持 + - * / ^ 五种运算)
其中“ / ”定义为真除True DIV,结果是浮点数类型
小技巧:
只需要把中缀表达式转化为后缀表达式中涉及’把操作符加入待输出列表‘的操作改为’从存储操作数的栈中pop两个元素进行运算并压入栈中‘的操作。
3、代码
#栈的实现(利用List) class Stack: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[len(self.items) - 1] def size(self): return len(self.items) #定义计算的主函数,返回值时float类型 def calculate(s) -> float: #定义运算函数,用于计算+-*/^运算 def doMath(op,op1,op2): if op=='*': return op1 * op2 elif op=='/': return op1 / op2 elif op=='+': return op1 + op2 elif op=='^': return op1**op2 else: return op1 - op2 #创建一个字典,用来比较各个运算符的优先级 prec={} prec['^']=4 prec['/']=3 prec['*']=3 prec['-']=2 prec['+']=2 prec['(']=1 #创建一个空栈,用来存储运算符。包括+-*/^和( opStack=Stack() #创建一个空栈,用来存储运算数 operandStack=Stack() #创建一个列表,将传入的字符串转化为由token组成的列表 tokenList=s.split() #遍历由token组成的列表 for token in tokenList: #如果是运算数,压入存储运算数的栈中 if token not in '^/*-+()': operandStack.push(int(token)) #如果是左括号,压入存储运算符的栈中 elif token=='(': opStack.push(token) #如果是右括号,把存储运算符的栈顶元素逐个pop出来,直到栈顶元素是左括号。 #pop出来的运算符与存储运算数的离栈顶最近的两个元素进行运算,结果压入存储运算数的栈中。 elif token==')': topToken=opStack.pop() while topToken!='(': operand2=operandStack.pop() operand1=operandStack.pop() result=doMath(topToken,operand1,operand2) operandStack.push(result) topToken=opStack.pop() #是运算符,当存储运算符的栈不空且栈顶元素优先级大于它时,栈顶元素逐个pop出来,直到栈顶元素优先级小于它 #pop出来的运算符与存储运算数的离栈顶最近的两个元素进行运算,结果压入存储运算数的栈中。 else: while (not opStack.isEmpty()) and (prec[opStack.peek()]>=prec[token]): operand2=operandStack.pop() operand1=operandStack.pop() result=doMath(opStack.pop(),operand1,operand2) operandStack.push(result) #把这个运算符压入存储运算符的栈中 opStack.push(token) #如果存储运算符的栈中不空,将存储运算符的栈中元素逐个pop出来 #pop出来的运算符与存储运算数的离栈顶最近的两个元素进行运算,结果压入存储运算数的栈中。 while not opStack.isEmpty(): operand2=operandStack.pop() operand1=operandStack.pop() result=doMath(opStack.pop(),operand1,operand2) operandStack.push(result) #返回与存储运算数的栈中最后剩下的元素,即为结果 return operandStack.pop() # 代码结束 # 调用检验 print("======== 1-calculate ========") print(calculate("( 2 + 3 ) * 6 + 4 / 2")) print(calculate("2 ^ 3 + 4 * 5 - 16 / 2")) print(calculate("( 5 + 1 ) * 2 / 3 - 3 ^ ( 2 + 8 / 4 ) / 9 + 6"))
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- PKU数据结构与算法Python版--习题总结(12)--硬币找零
- PKU数据结构与算法Python版--习题总结(11)--最小编辑距离
- PKU数据结构与算法Python版--习题总结(10)--博物馆大盗
- PKU数据结构与算法Python版--习题总结(9)--HTML标记匹配
- PKU数据结构与算法Python版--习题总结(8)--基数排序
- 数据结构与算法(Python语言实现)第四章 递归 总结和课后习题
- python学习习题总结(7)——构建矩阵,反转矩阵
- python学习习题总结(1)——求数字位数,正序倒序输出
- python学习习题总结(6)——统计重复数和非重复数,列表,字典
- python学习习题总结(2)——正方形,菱形,九九乘法表
- python学习习题总结(9)——练习题猴子桃子,7个数字组成的奇数。。。
- Goodrich python数据结构与算法python语言实现第一章习题答案
- python学习习题总结(5)——列表,去重,冒泡法
- python学习习题总结(3)——菲波那切数列,求10万以内素数优化
- Python中缀表达式求值
- python学习习题总结(8)——简单选择排序,列表解析式使用(格式化输出杨辉三角,九九乘法表)
- 数据结构和算法python语言描述——红绿灯问题自我总结
- [python]将中缀表达式(infix)转换为后缀表达式(postfix)
- Python读写文件方法总结
- Python常见读写文件操作实例总结【文本、json、csv、pdf等】