import logging
logging.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)
目前程序还有个缺陷,控制台输入的数字一般是斜体,如果是直体会无法识别。
暂时不清楚为啥会出现直体的情况,如果有知道的同学可以解答下