一、思路

有些类似于先把中缀表达式转化为后缀表达式,然后再对后缀表达式求值。但是因为我们最终只需要求出来的值,不想得到后缀表达式,所以就一边遍历一边计算了。关键点在于,我们借助两个栈,一个栈存放操作数,一个栈存放运算符。每次计算都是从运算符栈弹出一个运算符,从操作数栈弹出两个操作数,计算后的结果压回操作数栈。

二、代码实现

def infix_evaluator(infix_expression : str) -> int :'''这是中缀表达式求值的函数:参数 infix_expression:中缀表达式'''token_list = infix_expression.split()print(token_list)# 运算符优先级字典pre_dict = {'*':3,'/':3,'+':2,'-':2,'(':1}# 运算符栈operator_stack = []# 操作数栈operand_stack = []for token in token_list:# 数字进操作数栈if token.isdecimal() or token[1:].isdecimal():operand_stack.append(int(token))# 左括号进运算符栈elif token == '(':operator_stack.append(token)# 碰到右括号,就要把栈顶的左括号上面的运算符都弹出求值elif token == ')':top = operator_stack.pop()while top != '(':# 每弹出一个运算符,就要弹出两个操作数来求值# 注意弹出操作数的顺序是反着的,先弹出的数是op2op2 = operand_stack.pop()op1 = operand_stack.pop()# 求出的值要压回操作数栈# 这里用到的函数get_value在下面有定义operand_stack.append(get_value(top,op1,op2))# 弹出下一个栈顶运算符top = operator_stack.pop()# 碰到运算符,就要把栈顶优先级不低于它的都弹出求值elif token in '+-*/':while operator_stack and pre_dict[operator_stack[-1]] >= pre_dict[token]:top = operator_stack.pop()op2 = operand_stack.pop()op1 = operand_stack.pop()operand_stack.append(get_value(top,op1,op2))# 别忘了最后让当前运算符进栈operator_stack.append(token)# 表达式遍历完成后,栈里剩下的操作符也都要求值   while operator_stack:top = operator_stack.pop()op2 = operand_stack.pop()op1 = operand_stack.pop()operand_stack.append(get_value(top,op1,op2))# 最后栈里只剩下一个数字,这个数字就是整个表达式最终的结果return operand_stack[0]def get_value(operator : str, op1 : int, op2 : int):'''这是四则运算函数:参数 operator:运算符:参数 op1:左边的操作数:参数 op2:右边的操作数'''if operator == '+':return op1 + op2elif operator == '-':return op1 - op2elif operator == '*':return op1 * op2elif operator == '/':return op1 / op2# 用一个例子试试,得出了结果  -10
print(infix_evaluator('-5 * 1 - ( 2 + 3 )'))

如果这篇博文帮到了你,就请给我点个吧(#^.^#)

有疑问也欢迎留言~博主可nice啦,在线秒回ヾ(◍°∇°◍)ノ゙

Python实现中缀表达式求值相关推荐

  1. leetcode 282. Expression Add Operators | 282. 给表达式添加运算符(中缀表达式求值)

    题目 https://leetcode.com/problems/expression-add-operators/description/ 题解 中缀表达式求值问题,参考:leetcode 227. ...

  2. leetcode 224. Basic Calculator | 224. 基本计算器(中缀表达式求值)

    题目 https://leetcode.com/problems/basic-calculator/ 题解 中缀表达式求值,之前学数据结构的笔记: class Solution {public int ...

  3. leetcode 227. Basic Calculator II | 227. 基本计算器 II(中缀表达式求值)

    题目 https://leetcode.com/problems/basic-calculator-ii/ 题解 这道题是 中缀表达式求值 的简化版(因为没有左右括号运算),不过输入的形式有两个处理起 ...

  4. C++代码实现中缀表达式求值(基于中缀表达式转后缀表达式)

    C++代码实现中缀表达式求值(基于中缀表达式转后缀表达式) 样例输入:3*(2+5) 样例输出:21 代码:#include <bits/stdc++.h> using namespace ...

  5. DSOJ 中缀表达式求值

    题目链接 #include<stdio.h> //中缀表达式求值 #include<string.h> #include<stdlib.h> #define MAX ...

  6. 栈应用:中缀表达式求值

    后缀表达式求值比较简单,基本过程为:遇到数字则进栈,遇到运算符则出栈俩数字然后计算结果,再把结果入栈,过程比较简单,不再复习了,下面着重记录中缀表达式求值 中缀表达式求值可以先将中缀转后缀,再用后缀计 ...

  7. c语言中缀表达式求值_数据结构考研笔记之栈与队列(四)栈与队列应用括号匹配、中缀表达式转前缀后缀问题...

    文字:独木 排版:独木 图片:独木 栈与队列 1.括号匹配问题 栈 例题1 例题2-----不匹配例题1 例题3-----不匹配例题2 2. 表达式求值问题 例题 1.中缀表达式转前缀表达式 2.中缀 ...

  8. c语言中缀表达式求值_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)

    第三章:栈和队列 下面讲解栈的应用主要内容有:栈的应用.括号匹配.中 后 前 缀表达式转换 1.栈的应用 1.1括号匹配 我们在数学运算中 [(A+b)*c] - (E-F) 往往都会有[ ] 和 ( ...

  9. c语言中缀表达式求值_[源码和文档分享]基于C++的表达式计算求值

    一.使用说明 1.1 项目简介 表达式求值是程序设计语言编译中的一个最基本的问题,就是将一个表达式转化为逆波兰表达式并求值.具体要求是以字符序列的形式从终端输入语法正确的.不含变量的整数表达式,并利用 ...

最新文章

  1. java servlet 请求_Java中前台JSP请求Servlet实例(http+Servlet)
  2. Nature:新聘“诺奖级泰斗”研究揭示大脑中执行不同认知功能环路之间的协同作用
  3. pika开源:替代WebPack的全新JS构建工具
  4. 算法数据结构(一)-B树
  5. Java中expecial,RxJava 学习笔记 (一)
  6. 【Pascal's Triangle II 】cpp
  7. (05)FPGA入门条件
  8. js中的正则表达式(2)
  9. 图:[PPT双屏技术-知识竞赛方案策划]华中师范大学-城市与环境科学学院-城环学院地理知识竞赛胜利闭幕.
  10. Ubuntu 重置密码
  11. Bootstrap学习 - JavaScript插件
  12. 相关系数r和决定系数R2的那些事
  13. 芯力特SIT1043Q完全替代恩智浦TJA1043
  14. Excel列与数字的转换
  15. html删除子元素无效,如何使用JavaScript删除DOM节点的所有子元素?
  16. Eolink: 一站式 API 生产力工具
  17. 北京交警二环路机动车道“瘦身”,最高“礼遇”骑行人
  18. 经纬度转换为UTM坐标
  19. TCP/IP之大明内阁
  20. java最简单的kafka生产者和消费者,未结合spring

热门文章

  1. Python的格式化输出方式
  2. Ubuntu16.04 realtek网卡驱动消失解决方法
  3. linux apache配置文件
  4. git上传代码到远程仓库
  5. 广州看房网:认购书中的定金可以退吗?
  6. Samsung/三星I927(Galaxy S Glide) root教程_方法
  7. 通过支付宝完成阿里云个人账号实名认证的方法 新手必看的教程
  8. Cocos Creator-js中怎么删除一个精灵
  9. 每天5分钟玩转Kubernetes | Kubernetes网络模型
  10. Geomagic Studio 操作记录