要实现计算器就需要明白什么是中缀表达式和什么实后缀表达式,中缀表达式即运算符在数字之间,后缀表达式就是运算符在数字之后,要实现计算器就需要把中缀表达式转化为后缀表达式,然后再计算后缀表达式
中缀表达式转后缀表达式的方法:
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
中缀表达式转化为后缀表达式计算机实现
def infix2suffix(infix):
symbol =[]
list =[]
cs = infix.encode("utf-8")
sb=bytearray()
for c in cs:
if c == 40:
symbol.append(c)
if len(sb)>0:
list.append(sb.decode("utf-8"))
sb=bytearray()
elif c ==41:
ch=symbol.pop()
if len(sb)>0:
list.append(sb.decode("utf-8"))
sb.clear()
while ch != 40:
list.append(byte2str(ch))
if len(symbol)<=0:
break
ch=symbol.pop()
elif c == 43 or c == 45:
if len(sb)>0:
list.append(sb.decode("utf-8"))
sb.clear()
if len(symbol)<=0:
symbol.append(c)
continue
ch=symbol[-1]
while ch != 40:
list.append(byte2str(symbol.pop()))
if len(symbol)<=0:
break
ch=symbol[-1]
symbol.append(c)
elif c == 42 or c ==47:
if len(sb)>0:
list.append(sb.decode("utf-8"))
sb.clear()
if len(symbol)<=0:
symbol.append(c)
continue
ch=symbol[-1]
while ch != 40 and ch != 43 and ch != 45:
list.append(byte2str(symbol.pop()))
if len(symbol)<=0:
break
ch=symbol[-1]
symbol.append(c)
elif c == 94:
if len(sb)>0:
list.append(sb.decode("utf-8"))
sb.clear()
if len(symbol)<=0:
symbol.append(c)
continue
ch=symbol[-1]
while ch != 40 & ch != 43 and ch != 45and ch != 42and ch != 47:
list.append(byte2str(symbol.pop()))
if len(symbol)<=0:
break
ch=symbol[-1]
symbol.append(c)
else:
sb.append(c)
if len(sb)>0:
list.append(sb.decode("utf-8"))
sb.clear()
while len(symbol)>0:
list.append(byte2str(symbol.pop()))
return list
def byte2str(by):
cb=bytearray()
cb.append(by)
return cb.decode("utf-8")
计算后缀表达式
def calculateSuffix(list):
num=[]
for c in list:
if "+"==c:
a=num.pop()
b=num.pop()
num.append(a+b)
elif "-"==c:
a=num.pop()
b=num.pop()
num.append(b-a)
elif "*"==c:
a=num.pop()
b=num.pop()
num.append(a*b)
elif "/"==c:
a=num.pop()
b=num.pop()
num.append(b/a)
elif "^"==c:
a=num.pop()
b=num.pop()
num.append(pow(b, a));
else:
num.append(float(c));
return num.pop()
简单的实现了加减乘除指数运算,想要更多的运算自己稍微修改就可以了
源码地址https://download.csdn.net/download/qq_27012285/10766066
java下载地址https://download.csdn.net/download/qq_27012285/10766082