中缀表达式转为前缀表达式,然后根据前缀表达式计算结果
相关原理
理论部分请参照上面的博客,写的很清楚。
好的我们来看代码
举个栗子
(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])
结果:
中缀表达式转为前缀表达式,然后根据前缀表达式计算结果相关推荐
- 九、中缀表达式转为后缀表达式
使用栈将中缀表达式转为后缀表达式并计算 一.中缀表达式转换为后缀表达式 由于后缀表达式适合计算式进行计算,但是人对于较长的中缀表达式,很难将中缀表达式直接转换为后缀表达式,于是我们使用栈来实现中缀表达 ...
- Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现
1.堆栈-Stack 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- Algs4-1.3.10中序表达式转为后序表达式(第二次实现)
1.3.10编写一个过滤器InfixToPostfix,将算术表达式由中序表达式转为后序表达式. 答:本次做这个题时离上次做这个题有一个半月了,已经忘记了当时的算法.经过两个小时的研究(远低于第一次 ...
- 利用MATLAB中 MuPADNotebook组件将程序语言表达式转为数学表达式
前言 在论文写作或数模竞赛中,常需要把已经在程序中列写好的方程或表达式转为数学表达式,呈现在论文或其他书面文本中,利用MATLAB中 MuPADNotebook组件可以在保证高转换准确度的同时,提高我 ...
- 信息学奥赛一本通 1198:波兰表达式 | OpenJudge NOI 2.2 1696:波兰表达式
[题目链接] ybt 1198:波兰表达式 OpenJudge NOI 2.2 1696:波兰表达式 注:ybt上描述的其实是波兰表达式,而题目中的文字都是逆波兰表达式,是笔误了,应该当做波兰表达式看 ...
- 有趣的数据结构算法10——后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果
有趣的数据结构算法10--后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果 解题思路 实现代码 GITHUB下载连接 在前一天已经利用栈完成2进制到8进制的转换.但是栈的应用方面还有很多,本次我将 ...
- 浏览器兼容--条件样式,选择符前缀,样式属性前缀
浏览器兼容--条件样式,选择符前缀,样式属性前缀 2012-12-05 09:20 by greenal, 1570 阅读, 0 评论, 收藏, 编辑 原文地址-- http://www.w3cplu ...
- 浏览器兼容--条件样式,选择符前缀,样式属性前缀(转)
浏览器兼容--条件样式,选择符前缀,样式属性前缀 2012-12-05 09:20 by greenal, 1570 阅读, 0 评论, 收藏, 编辑 原文地址-- http://www.w3cplu ...
- php表达式生成工具,thinkPHP5.0数据查询表达式生成技巧
thinkPHP的查询表达式大揭秘 主要使用where(条件表达式)方法 语法一:where('字段','条件','值'): 等于:EQ 解析为"=" 不等于:NEQ 解析为&qu ...
- 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数(day4)
一.三元表达式.列表推导式.生成器表达式 1.三元表达式name=input('姓名>>: ')res='SB' if name == 'alex' else 'NB'print(res) ...
最新文章
- android studio3.0升级,升级androidStudio3.0的问题
- 文巾解题 1433. 检查一个字符串是否可以打破另一个字符串
- micropython esp32手册_使用ESP32控制板(二):燒錄MicroPython韌體
- SAP Spartacus cost center Add按钮的href属性生成逻辑分析
- java执行多次post请求_同样的post请求代码在Java和android中执行结果不同。
- EventThread线程对VSync的接收
- Windows API一日一练(69)GetTickCount函数
- 直流电机驱动电路设计
- 查手机服务器ip和端口网站,如何查询服务器ip地址和端口号
- Avant Browser
- 斯坦福用算法降低:令欧洲头大的难民犯罪率
- MapReduce强化实验
- ElasticSearch Java 客户端连接ElasticSearch
- phpstudy安装yar扩展
- 毕业设计-基于机器视觉的手写字识别系统
- PlantCV中文文档
- 海信E5K电视怎么样,海信E5K 65、75、100英寸选哪个好
- 【联盛德W806上手笔记】八、SPI及其DMA
- 系统集成十大项目管理(1)
- pytorch 问题:_, term_width = os.popen(‘stty size‘, ‘r‘).read().split()
热门文章
- G2自定义图例,数据更新时渲染问题。
- python抖音接口_「docker实战篇」python的docker-抖音分析接口数据分析(21)
- 【c语言】 我使用c语言基础做了一个老少皆宜的”国民小游戏(三字棋)“
- 海思AI芯片(Hi3519A/3559A)方案学习(十七)开发板上运行yolo3模型的代码分析
- 基石为勤能补拙的迷宫之旅——第八天(Python文件操作)
- vue 页面调用另一个页面的方法
- 算法岗面经总结(京东)
- Spring配置dbcp数据源
- 《西部世界》中“人工智能”之上的类人类嗅觉,初步实现了!
- 编程学不进去?如何才能拯救你的编程能力?