Python3实现逆波兰表达式计算
来源:互联网 发布:linux系统jdk下载官网 编辑:程序博客网 时间:2024/06/07 06:31
import logginglogging.basicConfig(level=logging.INFO)import re##判断字符串是否为小数def isnumber(num): regex = re.compile(r"^(-?\d+)(\.\d*)?$") if re.match(regex,num): return True else: return False#自定义栈class PyStack(object): def __init__(self,initSize=20,incSize=10): self.initSize=incSize self.incSize=incSize self.stackList=[] self.top=self.bottom=0 def push(self,ele): if self.top-self.bottom>=self.initSize: self.incSize+=self.initSize self.stackList.append(ele) self.top+=1 def pop(self): if self.top-self.bottom>0: self.top-=1 ret=self.stackList.pop() return ret else: return None def len(self): return self.top-self.bottom##算式转化为中缀表达式列表def equation2List(): equation=input("请输入你要运算的方程:") result=[] buffNum=[] for i in equation: if i.isdigit() or i=='.': buffNum.append(i) else: if len(buffNum)>0: result.append("".join(buffNum)) buffNum.clear() result.append(i) if len(buffNum)>0: result.append("".join(buffNum)) buffNum.clear() logging.info(result) return result##中缀表达式转后缀表达式## 1+2*(3+4)=15##1 2 3 4 + * +def mid2EndSuffix(list): resultList=[] stack=PyStack() for i in list: if isnumber(i): resultList.append(i) elif ')' == i: while stack.len()>0: item=stack.pop() logging.debug(")pop==%s"%(item)) if '('==item: break else: resultList.append(item) elif '+' == i or '-' == i: if stack.len() == 0: stack.push(i) logging.debug("+-None=push==%s"%i) else: while stack.len()>0: item2=stack.pop() logging.debug("+-=pop==%s"%item2) if '(' == item2: stack.push(item2) logging.debug("+-=(push==%s"%item2) break else: resultList.append(item2) stack.push(i) logging.debug("+-lastpush==%s"%i) elif '*' == i or '/' == i or '(' == i: stack.push(i) logging.debug("*/(push==%s"%i) else: print("输入格式有误") while stack.len()>0: item3=stack.pop() logging.debug("last==pop=%s"%item3) resultList.append(item3) return resultList##后缀表达式计算结果def calEndSuffixResult(list): stack=PyStack() sumEnd=0 if len(list)==0: return sumEnd for i in list: if isnumber(i): stack.push(float(i)) elif '+'==i: a=stack.pop() b=stack.pop() stack.push(b+a) elif '-'==i: a = stack.pop() b = stack.pop() stack.push(b - a) elif '*'==i: a = stack.pop() b = stack.pop() stack.push(b * a) elif '/'==i: a = stack.pop() b = stack.pop() if a==0: print('%d/%d分子不能为0'%(b,a)) else: stack.push(b/a) return stack.pop()if __name__=='__main__': eList=equation2List() midEList=mid2EndSuffix(eList) logging.info(midEList) lastResult=calEndSuffixResult(midEList) print("算式的结果是:",lastResult)
目前程序还有个缺陷,控制台输入的数字一般是斜体,如果是直体会无法识别。
暂时不清楚为啥会出现直体的情况,如果有知道的同学可以解答下
0 0
- Python3实现逆波兰表达式计算
- C++实现 逆波兰表达式计算问题
- 逆波兰表达式计算
- 计算表达式-逆波兰表达式
- android逆波兰表达式的应用(四)逆波兰表达式的计算实现 -----小达
- 逆波兰表达式实现
- 递归计算逆波兰表达式
- MFC计算器 用vector实现和计算逆波兰表达式
- 计算表达式的值c++逆波兰式实现方法
- 逆波兰表达式 转换和计算 C++实现
- 数据结构-------计算逆波兰表达式(后缀表达式)
- 逆波兰表达式算法实现
- 逆波兰表达式java实现
- 逆波兰表达式原理实现
- 波兰、逆波兰表达式
- 逆波兰表达式的生成及计算
- 逆波兰表达式的生成及计算
- Python小练习:逆波兰表达式计算
- [PlantSimulation]实例:设备故障率对产出率的影响
- 免费的论文查重网站
- 利用运行时,给UIImageView写一个分类,交换里面的setImage的方法,可以重绘图片,提高内存的利用率(要是没有重绘图片,直接使用系统提供的setImag就会造成占用大量的内存问题)
- poj2376(贪心)
- 小白起步,警醒自己
- Python3实现逆波兰表达式计算
- 冒泡排序
- 表格如何嵌套表单,如何在用表格给表单排版
- WebSockets[翻译]
- 南阳oj _600花儿朵朵(树状数组插线问点+坐标离散化)
- 【MOOC】Python数据分析与展示-北京理工大学-【第三周】数据分析之概要
- 一维数组的冒泡排序
- 在Eclipse中使用JUnit4进行单元测试(高级篇)
- 07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-查询+中断+引入poll机制的按键驱动程序