相关原理
理论部分请参照上面的博客,写的很清楚。

好的我们来看代码

举个栗子

(9-((1+3)*2))/2
结果是0.5

def infix_to_prefix(expression):assert type(expression)==listexpression.reverse()priority={'+':0,'-':0,'*':1,'/':1}operator_list=[]#运算符的英文是operatoroperand_list=[]#操作数的英文是operandfor each_element in expression:if each_element not in priority and each_element not in ['(',')']:operand_list.append(each_element)#操作数直接push到操作数栈else:if each_element not in ['(',')']:#表明此时是运算符,不是括号if len(operator_list)==0 or operator_list[-1]==')':#如果运算符栈为空,或者栈顶元素是右括号,那么直接pushoperator_list.append(each_element)elif priority[each_element]>=priority[operator_list[-1]]:#如果这个运算符的优先级大于栈顶运算符的优先级,直接pushoperator_list.append(each_element)else:#此时需要将运算符栈顶的运算符弹出来放到操作数栈中operand_list.append(operator_list.pop())else:#此时是括号if each_element==')':#右括号直接入栈operator_list.append(each_element)else:assert each_element=='('#左括号的时候从运算符栈中弹出运算符,直到遇到右括号为止,将这对括号中间的运算符放到操作数栈中while(operator_list[-1]!=')'):operand_list.append(operator_list.pop())operator_list.pop()while(len(operator_list)!=0):operand_list.append(operator_list.pop())operand_list.reverse()           return operand_list

上面的函数已经将中缀表达式转化为了前缀表达式,相关原理那篇博文已经说的很清楚了。

但是那篇博客没有介绍如何根据前缀表达式计算结果,这里我说一下

  • 定义一个栈,从右向左扫描前缀表达式
  • 如果是操作数,则将操作数压入栈中
  • 如果是运算符,则从栈中取出来两个操作数,计算结果,再放回栈中

下面我们根据前缀表达式计算结果

def compute_prefix_expression(prefix):stack=list()for i in range(len(prefix)-1,-1,-1):element=prefix[i]if element not in ['+','-','*','/']:stack.append(element)else:a=stack.pop()b=stack.pop()stack.append(str(eval(a+element+b)))assert len(stack)==1return eval(stack[0])

结果:

中缀表达式转为前缀表达式,然后根据前缀表达式计算结果相关推荐

  1. 九、中缀表达式转为后缀表达式

    使用栈将中缀表达式转为后缀表达式并计算 一.中缀表达式转换为后缀表达式 由于后缀表达式适合计算式进行计算,但是人对于较长的中缀表达式,很难将中缀表达式直接转换为后缀表达式,于是我们使用栈来实现中缀表达 ...

  2. Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现

    1.堆栈-Stack 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  3. Algs4-1.3.10中序表达式转为后序表达式(第二次实现)

    1.3.10编写一个过滤器InfixToPostfix,将算术表达式由中序表达式转为后序表达式.  答:本次做这个题时离上次做这个题有一个半月了,已经忘记了当时的算法.经过两个小时的研究(远低于第一次 ...

  4. 利用MATLAB中 MuPADNotebook组件将程序语言表达式转为数学表达式

    前言 在论文写作或数模竞赛中,常需要把已经在程序中列写好的方程或表达式转为数学表达式,呈现在论文或其他书面文本中,利用MATLAB中 MuPADNotebook组件可以在保证高转换准确度的同时,提高我 ...

  5. 信息学奥赛一本通 1198:波兰表达式 | OpenJudge NOI 2.2 1696:波兰表达式

    [题目链接] ybt 1198:波兰表达式 OpenJudge NOI 2.2 1696:波兰表达式 注:ybt上描述的其实是波兰表达式,而题目中的文字都是逆波兰表达式,是笔误了,应该当做波兰表达式看 ...

  6. 有趣的数据结构算法10——后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果

    有趣的数据结构算法10--后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果 解题思路 实现代码 GITHUB下载连接 在前一天已经利用栈完成2进制到8进制的转换.但是栈的应用方面还有很多,本次我将 ...

  7. 浏览器兼容--条件样式,选择符前缀,样式属性前缀

    浏览器兼容--条件样式,选择符前缀,样式属性前缀 2012-12-05 09:20 by greenal, 1570 阅读, 0 评论, 收藏, 编辑 原文地址-- http://www.w3cplu ...

  8. 浏览器兼容--条件样式,选择符前缀,样式属性前缀(转)

    浏览器兼容--条件样式,选择符前缀,样式属性前缀 2012-12-05 09:20 by greenal, 1570 阅读, 0 评论, 收藏, 编辑 原文地址-- http://www.w3cplu ...

  9. php表达式生成工具,thinkPHP5.0数据查询表达式生成技巧

    thinkPHP的查询表达式大揭秘 主要使用where(条件表达式)方法 语法一:where('字段','条件','值'): 等于:EQ 解析为"=" 不等于:NEQ 解析为&qu ...

  10. 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数(day4)

    一.三元表达式.列表推导式.生成器表达式 1.三元表达式name=input('姓名>>: ')res='SB' if name == 'alex' else 'NB'print(res) ...

最新文章

  1. UIWebView之获取所点位置图片URL
  2. Thread Join()的用法
  3. golang包math/rand使用示例
  4. spring学习(47):bean的作用域
  5. php批量下载网络图片,php批量下载网页图片并替换路径为本地
  6. 【Linux学习】GDB调试器基本命令必知必会(一)
  7. axios流输出excel
  8. 人工智能运行环境linux,Intel OpenVINO 人工智能推论环境搭建 (Linux) 第一章
  9. python post json参数,Python requests.post方法中data与json参数区别详解
  10. hive left join入门
  11. vue使用echarts全国地图
  12. winPE4.0制作过程
  13. Python爬虫之青果教务系统
  14. 活体检测论文研读三:Learning Deep Models for Face Anti-Spoofing: Binary or Auxiliary Supervision
  15. 共享单车、公交车辆位置、地铁等50+个交通数据集
  16. inno setup打包脚本总结
  17. MySQL中间件Atlas安装及使用
  18. 中职计算机应用技术是学什么的,自贡职业技术学校:计算机应用技术
  19. 2023年中国电竞行业研究报告
  20. 解决“Vector Hardware Manager无法连接This Computer”(能够独立解决问题,体现一个人的综合能力)

热门文章

  1. excel的vlookup如果是#N/A就显示空白
  2. SVM Kernel学习笔记
  3. java后台判断请求来自移动端访问还是PC端访问
  4. 计算机 何志东 论文,2017年湘潭教学论文评比结果.doc
  5. 关于我用chat gpt生成了一篇nba比赛前瞻预测文章,大家觉得怎么样!
  6. STM32第一课:STM硬件实物图+功能简介
  7. IIS 7 Smooth Streaming技术在Silverlight 3中的应用
  8. 万年历c语言攀枝花,C语言实现万年历
  9. 初学计算机网络(一):使用cmd命令
  10. Adobe Photoshop CC 2019删除的水印或者文字的方法