为了学习python,前段时间从网上看到一个题目(百练题号4132),求解输入的四则运算式。输入是一个包含加、减、乘、除四则运算式,输出计算结果,取小数点后两位。
一、实现思路
1. 从键盘读取四则运算式,这里读的是一个字符串S。2. 将字符串S划分为单个的运算符和运算数。这里把加“+”、减“-”、乘“*”、除“/”称为运算符,数字称为运算数,运算数可以为整数、小数。
3. 将划分出的运算符和运算数,按照原来的顺序,重新组成一个列表tokenlist。
4. 对元组列表tokenlist,按照从左到右的顺序依次进行处理。
二、函数介绍
代码中定义并实现了几个函数。其中:
三、源码
# Caculate four fundamental rules expression
import io
from collections import deque
import time
def delSpace(s):
""" Delete blank space in String
"""
s1 = ''
for a in s:
# if a is blank space,
if a != ' ':
s1 += a
return s1
def toDigitl(sl):
"""
INPUT:['1','+','2.3','+','4'] OUTPT:[1,'+',2.3,'+',4]
"""
d = []
sign = ['+','-','*','/','(',')']
for s in sl:
if (s in sign):
d.append(s)
elif s.isnumeric():
d.append(int(s))
else:
d.append(float(s))
return d
def tokenList(s):
"""
e.g. s = '1+2+4' , return ['1','+','2','+','4']
"""
t1 = []
sp = ''
sign = ['+','-','*','/','(',')']
j, k = 1, 0
for i in range(len(s)):
if s[i] in sign:
if s[i-1] in sign:
sp = s[k:k+j]
j += 1
else:
t1.append(sp)
t1.append(s[i])
j = 1
k = i + 1
else:
sp = s[k:k+j]
j += 1
# process last char
if i == len(s)-1:
t1.append(sp)
# pop right bracket
if i == len(s)-1 and s[i] in sign:
t1.pop()
return t1
def fourRules(a,b,s):
if s == '+': return a+b
if s == '-': return a-b
if s == '*': return a*b
if s == '/': return a/b
def xcacu(ns,sg):
b1 = ns.pop()
a1 = ns.pop()
r = fourRules(a1,b1,sg)
ns.append(r)
def caculate(tokenlist):
numStack = deque()
opStack = deque()
ops = ['+','-','*','/','(',')']
opps = {'+':0,'-':0,'*':1,'/':1,'(':2,')':2}
opCurrent = ''
for i in range(len(tokenlist)):
if tokenlist[i] in ops:
opStack.append(tokenlist[i])
else:
numStack.append(tokenlist[i])
if i= 2 and len(opStack) >= 1:
opCurrent = opStack.pop()
if opps[tokenlist[i+1]] <= opps[opCurrent]:
xcacu(numStack,opCurrent)
else:
opStack.append(opCurrent)
if i == len(tokenlist)-1:
xcacu(numStack,opCurrent)
# print(i,numStack,opStack)
while(len(opStack) > 0):
xcacu(numStack,opStack.pop())
return numStack.pop()
def main():
s = input()
while s != 'q':
starttime = time.time()
tt = toDigitl(tokenList(delSpace(s)))
print('%s is %.2f.'%(s,caculate(tt)))
endtime = time.time() - starttime
print('RUN TIME:%.10f ms'%(endtime*1000))
s = input()
if __name__=='__main__':
main()
四、运行结果
五、后续工作
看到有人用二叉树来存储运算式,笔者在这里只是用python自带的collections库中的deque来模拟栈。这里运算符中虽然写了左右括号,但现在还未实现,仅完成不带括号情况下的四则计算部分。带括号部分,写好后再贴出来。