【Python】洛谷 P1175_表达式的转换(逆波兰式、中缀表达式、后缀表达式、栈)
目录
- 题目
- 代码
- AC截图
题目
代码
碎碎念:我用来复习栈的,刷了巨长时间,一直Runtine Error,编译直接就没有过。
好家伙,然后发现是数据给的不够严谨,左右两端有空格,使用strip()处理一下就好了。
# 栈结构
class Stack:def __init__(self,*args):self.items = [i for i in args]def __str__(self):return str(self.items)def push(self,item):self.items.append(item)def pop(self):return self.items.pop()def is_empty(self):return self.items == []def peek(self):return self.items[-1]# 返回最后一个元素def size(self):return len(self.items)def show(self):return self.itemsdef clear(self):self.items = []# 中缀表达式 => 后缀表达式
# LG P1175 表达式的转换def change_expression(s: str):dic = {"(": 0,"^": 3,"*": 2,"/": 2,"+": 1,"-": 1}stack = Stack() # 存储符号res = [] # 放答案for i in s:# 操作符if i in ['+', '-', '*', '/', '^']:# 要先取出优先级更高的,或者相等的运算符while (not stack.is_empty() and dic[stack.peek()] >= dic[i]):res.append(stack.pop())stack.push(i)elif i == '(':stack.push(i)elif i == ')':top_token = stack.pop()while (top_token != '('):res.append(top_token)top_token = stack.pop()else:# 运算数res.append(i)# 剩余元素全部加入while not stack.is_empty():res.append(stack.pop())return " ".join(res)def calc_postfix_expression(s: str):# 计算后缀表达式stack = Stack()# start 方便输出temp = list(s)index = 0# end 方便输出for i in s:if i in "0123456789":# 运算数stack.push(int(i))else:# 运算符op2 = stack.pop()op1 = stack.pop()ans = do_math(i, op1, op2)stack.push(ans)# start 输出依次结果before = temp[0:index-2]before.append(str(ans))out = before + temp[index+1:]temp = outindex = index - 2print(" ".join(out))# end 输出结果index += 1return stack.pop()def do_math(op, op1, op2):if op == '+':return op1+op2elif op == '-':return op1-op2elif op == '*':return op1*op2elif op == '/':return op1//op2elif op == '^':return op1**op2if __name__ == '__main__':# 对于题目中的输入字符串一定要小心(如果比赛题目不严谨,会导致很多问题,最后strip()一下)expression = input().strip()res = change_expression(expression)# res = change_expression("(1+2)*3-4")print(res) # 输出结果calc_postfix_expression(res.replace(" ", ""))# print(ans)
AC截图
【Python】洛谷 P1175_表达式的转换(逆波兰式、中缀表达式、后缀表达式、栈)相关推荐
- php逆波兰表达式,PHP实现逆波兰式 - 计算工资时用
近期一个小项目需要用到公式运算, 所以就进行一些了解,以下内容均属于个人经验. 在PHP中实现公式表达式四则运算大概有两种方法: 1)使用系统函数eval 2)将表达式转换成逆波兰表达式进行计算. / ...
- 波兰式,逆波兰式,中缀表达式相互转换
引入波兰式与逆波兰式: 一个式子,可以分成几个层面来看.比如1 + 2 * 3,我们看它是个算式,计算机看它,那就是个字符串,所以首先必须把它拆分成计算机可以操作的数据单元,就是Tokenize.比如 ...
- JavaScript实现逆波兰式
中缀表达式就是我们平时见到的算数表达式:前缀表达式被称为波兰式:后缀表达式被称为逆波兰式 中缀表达式转换逆波兰式实现逻辑 创建运算符栈operator,结果栈result 中缀表达式从左到右出栈 当字 ...
- 逆波兰式求值 —Java
首先我们了解一下什么叫逆波兰表达式? 逆波兰式,也叫后缀表达式(即运算符写在操作数之后) 例: 9 3 / 而我们日常所用的表达式都是中缀表达式,与逆波兰式是不一样的 上述的逆波兰式可能大家已经知道了 ...
- 【C++】栈的应用:逆波兰式的实现
逆波兰表达式 一.定义 二.逆波兰式的意义 三.逆波兰式的实现 1.方法 (1)中缀表达式转化为后缀表达式 (2)由后缀表达式计算结果 2.代码实现 一.定义 逆波兰式,又称后缀表达式,指的是操作符在 ...
- php逆波兰表达式,PHP根据数字的字符表达式计算出结果(转换成逆波兰式再求解)[转]...
这个简单的计算器采用的是逆波兰式来做的,仅支持加减乘除四种运算,纯粹个人练习记录一下,还望多多支持. 用法 require 'Calc.php'; $calc = new Calc('(1+9)/2' ...
- 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...
- 波兰式与逆波兰式的转换和表达式求值
文章目录 一.前言 二.表达式 1.中缀表达式 1.1 定义 2.前缀表达式 2.1 定义 2.2 求值 3.后缀表达式 3.1 定义 3.2 求值 三.表达式转换 1.中缀表达式转换成后缀表达式 1 ...
- 中缀表达式转换成逆波兰式
栈的应用:中缀表达式转换成逆波兰式 小白前来报道!懒癌患者的第一篇博客,实属不易,先为自己鼓个掌. 编写程序,将任意一个合法的中缀表达式转换成逆波兰式. [问题描述]表达式计算是实现程序设计语言的基本 ...
- 将表达式转换成逆波兰式
http://www.cnblogs.com/stay-foolish/archive/2012/04/25/2470590.html 假设表达式由单字母变量和双目四则运 算算符构成.试写一个算法,将 ...
最新文章
- win7安装omnetpp-4.6
- sql查询每个学生的最高成绩mysql语句
- update 后面能接子查询吗_只用身份证能查询CPA成绩吗?查询步骤不能忘
- JAVA 排序工具类
- merge intervals(合并间隔)
- 4.MySQL基础操作
- Ubuntu18.04系统快速下载Github代码
- ARCH-LINUX 折(安)腾(装)记
- 重启php7.0-fpm
- php文件的锁定机制
- adb:设置手机屏幕亮度
- macBigSur使用mathtype数学公式编辑
- 20200107笔记
- vue大文件上传控件选哪个好?
- DDD | 领域驱动设计 Vs 敏捷 Vs 面向对象
- Linux文件和目录管理(3)
- 织梦模板修改方法大全
- 海洋静力触探仪(CPT)一次故障记录
- 北邮网研院宿舍_北邮研究生宿舍条件(北邮研究生宿舍图片)
- 读书心得 | 软技能-代码之外的生存指南