您的位置:首页 > 编程语言 > Python开发

python实现中缀表达式计算,实现指数和对数

2018-01-05 09:32 417 查看
import os,sys,decimal,math

def stack_sum_pop(sign,sum):
t2,t3=0,0
t1=sign.pop()
sum_a=0.00
decimal.getcontext().prec=2
if t1=='+':
t2 = sum.pop()
t3 = sum.pop()
sum_a+=t2+t3
if t1=='-':
t2 = sum.pop()
t3 = sum.pop()
sum_a+=t3-t2
if t1=='*':
t2 = sum.pop()
t3 = sum.pop()
sum_a+=t2*t3
if t1=='/':
t2 = sum.pop()
t3 = sum.pop()
sum_a=t3/t2
if t1=='l':
t2 = sum.pop()
sum_a=math.log(t2,10)
if t1=='e':
t2 = sum.pop()
sum_a=math.exp(t2)
if t1=='p':
t2 = sum.pop()
t3 = sum.pop()
sum_a=pow(t3,t2)
if t1=='(' :
sum_a=sum.pop()
return  sum_a#出栈计算
def prio(s,sign):#优先级判断
a1,a2=0,0
if s=='+' or s=='-' :
a1=2
if s=='*' or s== '/' :
a1=4
if s=='(' :
a1=8
if s=='l' or s== 'e' or s=='p' :
a1=6
if s==')' :
a1=1
if s=='\n' :
a1=0
if not sign:
a2=0
else:
if sign[-1]=='+' or sign[-1]== '-' :
a2=3
if sign[-1]=='*' or sign[-1]=='/' :
a2=5
if sign[-1] == 'l' or sign[-1] == 'e' or sign[-1] == 'p':
a2 = 7
if sign[-1]=='(' :
a2=1.5
if sign[-1]==')' :
a2=9
if (a1>a2):
return -1#当前运算符优先级高于栈顶
if(a1==a2):
return 0#优先级相等
if (a1<a2):
return 1#当前运算符优先级低于栈顶
def pipei(string):
n=0
for s in string:
if s=='(':
n=n+1
if s==')':
n=n-1
if n<0:
return 2
else:
return 1#简单的圆括号匹配

def sum_push(string):
sum=list()
sign=list()
str=''
str1=''
if pipei(string) == 2:
return '错误'
else:

if 'log' in string :
string=string.replace('log','l')
if 'exp' in string:
string=string.replace('exp','e')
if 'pow' in string:
string=string.replace('pow','p')

for s in string:
if s not in ['(',')','+','-','*','/','\n','l','e','p',',']:
str=str+s
else:
if str:
sum.append(eval(str))
str=''#遇见操作数直接操作数进栈
if s==',':
continue
x = sign
p = prio(s, sign)
if s=='\n' and not sign:
if sum:
return sum.pop()
if p==-1 and s !=')' and s!='\n':#当前运算符优先级高于栈顶
sign.append(s)
elif p==1:#当前运算符优先级低于栈顶
while(p==1):
if s==')' and sign[-1]=='(':
sign.pop()
break
sum.append(stack_sum_pop(sign,sum))
p=prio(s,sign)#出栈计算
if s !=')' and s!='\n':
sign.append(s)#当为括号和反斜杠n时不入栈
while(sign):
sum.append(stack_sum_pop(sign, sum))#出栈计算
if sum:
return sum.pop()
else:
return '\n'

infile=open("input.txt",'r')#文件操作
ofile=open("output.txt",'w+')
j=0
for line in infile.readlines():#从第二行开始读
j=j+1
if j!=1:
a=str(sum_push(line))
ofile.write(a)
ofile.write('\n')
infile.close()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: