为了学习python,前段时间从网上看到一个题目(百练题号4132),求解输入的四则运算式。输入是一个包含加、减、乘、除四则运算式,输出计算结果,取小数点后两位。

一、实现思路

1. 从键盘读取四则运算式,这里读的是一个字符串S。

2. 将字符串S划分为单个的运算符和运算数。这里把加“+”、减“-”、乘“*”、除“/”称为运算符,数字称为运算数,运算数可以为整数、小数。

3. 将划分出的运算符和运算数,按照原来的顺序,重新组成一个列表tokenlist。

4. 对元组列表tokenlist,按照从左到右的顺序依次进行处理。

  • 处理过程中用到几个数据:两个栈:numStack,用于存储操作数;opStack,用来存储操作符;一个ops列表,保存了6种运算符:+、-、*、/、(、)。一个opps字典,保存了运算符优先级。
  • 如果tokenlist[i] 不是操作符,就将其压入numStack,否则,压入opStack。虽然根据numStack和opStack的状态分别作出相应的处理。主要处理过程放在压入numStack之后。

二、函数介绍

代码中定义并实现了几个函数。其中:

  • main()        主函数。
  • delSpace() 删除输入串中间夹杂的空格符号(目前是多余的)。
  • toDigitl()     将输入串中的运算数从字符型转换成数值型(有整数、有浮点数)。
  • tokenlist()   将输入串划分成单个的运算符和运算数。这里的关键是处理小数点和最后面的括号。识别运算符的方法就是查找运算符列表,如果在ops中则认为是。识别运算数的方法,是用两个变量分别代别一个运算数的开始位置和结束位置,用这两个代表位置的变量,对输入串进行切片。
  • caculate(tokenlist)   是主要计算函数,参数为处理过的输入串,返回结果。在写caculate()的过程中,对重复出现和影响代码理解的部分进行了改写,结果就多出了两个函数:fourRules() 、xcacul()。

三、源码

# Caculate four fundamental rules expressionimport io
from collections import deque
import timedef delSpace(s):"""   Delete blank space in String"""s1 = ''for a in s:# if a is blank space, if a != ' ':s1 += areturn s1def 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 ddef tokenList(s):"""e.g. s = '1+2+4' , return ['1','+','2','+','4']"""t1 = []sp = ''sign = ['+','-','*','/','(',')']j, k = 1, 0for i in range(len(s)):if s[i] in sign:if s[i-1] in sign:sp = s[k:k+j]j += 1else:t1.append(sp)t1.append(s[i])j = 1k = i + 1else:sp = s[k:k+j]j += 1# process last char    if i == len(s)-1:t1.append(sp)# pop right bracketif i == len(s)-1 and s[i] in sign:t1.pop()                 return t1def fourRules(a,b,s):if s == '+': return a+bif s == '-': return a-bif s == '*': return a*bif s == '/': return a/bdef 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<len(tokenlist)-1 and len(numStack) >= 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() - starttimeprint('RUN TIME:%.10f ms'%(endtime*1000))s = input()if __name__=='__main__':main()

四、运行结果

五、后续工作

看到有人用二叉树来存储运算式,笔者在这里只是用python自带的collections库中的deque来模拟栈。这里运算符中虽然写了左右括号,但现在还未实现,仅完成不带括号情况下的四则计算部分。带括号部分,写好后再贴出来。

python 实现四则运算(一)相关推荐

  1. 利用Python实现四则运算

    利用Python实现四则运算 输入两个变量,根据类型判断他是否进行运算,若为a和b同时满足int或float类型时,则利用choice选择你所要进行的那种运算,若类型错误,输出其类型. a=eval( ...

  2. python实现四则运算_自动生成四则运算题目(python实现)

    自动生成四则运算题目(python实现) 项目分析 项目仓库: 地址 需求 仅包含四则运算 结果不能为负数 数字大小在 100 以内 支持真分数运算 设计实现过程及代码说明 项目文件结构如下: 模块 ...

  3. python的四则运算教案_python四则运算

    github地址:https://github.com/lkdgn/python1/tree/master/python%E5%9B%9B%E5%88%99%E8%BF%90%E7%AE%97 题目: ...

  4. python函数编程四则运算并输出结果_python_四则运算

    Github项目地址 [小学生的四则运算]--PSP表格 psp 任务计划 计划完成需要的时间(min) 实际完成需要的时间 Planning 计划 120 60 Estimate 估计这个任务需要多 ...

  5. python实现四则运算_四则运算 Python实现(杨浩政,张兆敏)

    四则运算 项目要求: 题目:实现一个自动生成小学四则运算题目的命令行程序说明: 说明: 自然数:0, 1, 2, -. 真分数:1/2, 1/3, 2/3, 1/4, 1'1/2, -. 运算符:+, ...

  6. python编写四则运算_python实现四则运算

    https://gitee.com/szh123/four_arithmetic_implementation.git 1.需求分析: 实现四则运算题目及答案生成,控制生成题目的个数,题目中数值不超过 ...

  7. python实现四则运算_python实现的四则运算练习

    实现的功能:1,面向做题人:即时生成四则运算,等待做题人输入结果,然后判断结果是否正确,并给出反馈. 2,面向老师:按照老师输入的题目数量,生成相应数目的四则运算题目,并给出答案. 代码: impor ...

  8. python函数编程四则运算并输出结果_python四则运算

    题目: (1)能自动生成小学四则运算题目,并且不能出现负数: (2)能支持真分数的四则运算: 思路: (1)四则运算加减乘除,采用两个随机数,由于不能出现负数,则对两个随机数进行比较大小再进行减法运算 ...

  9. python中四则运算符号_Python-四则运算-蔡晓晴,杜婷萱

    一.需求 1.使用-n 参数控制生成题目的个数 2.使用-r 参数控制题目中数值(自然数.真分数和真分数分母)的范围 3.生成的题目中计算过程不能产生负数 4. 生成的题目中如果存在形如e1 ÷ e2 ...

最新文章

  1. SAP HUM针对HU做货物移动后生成的物料凭证何处看相关的HU信息?
  2. Eclipse连接MySQL数据库(傻瓜篇)
  3. CUDA程序编写具体参数设置
  4. overridePendingTransition的简介
  5. mysql 自定义函数
  6. 一起开心暑假集训第一周限时训练 2020/7/5
  7. html自动播放auto,为移动而生的 HTML 属性autocapitalize和autocorrect
  8. 护士计算机怎么报名,护士自考本科怎样报名
  9. 宁夏职称评计算机,宁夏专业技术人员服务平台职称评审系统:http://124.224.239.164(2)...
  10. JDK历史版本主要新特性
  11. Word2016以上版本兼容模式不能使用公式编辑器的解决办法
  12. python合并单元格的方法是_python合并多个excel单元格的方法
  13. DAOs(去中心化自治组织)
  14. matlab怎么画隐函数图像,matlab中如何画隐函数的图像
  15. Openlayers 快速上手教程
  16. 3D 电影、全息显示这些技术如何骗过我们的眼睛?
  17. 修改计算机 注册到 用户,电脑修改注册表导致开机时电脑显示“无法登陆到你的账户”的问题解决方案...
  18. 菜鸟学汇编005 栈(Stack) 和 段寄存器SS、SP
  19. GEB第八章印符数论翻译练习的思考
  20. SDI接口详解(先占个坑)

热门文章

  1. mysql got signal 11_从库crash一直自动重启(mysqld got signal 11)问题解决
  2. PHP File 文件格式
  3. 关于 Word 如何创建临时文件的说明
  4. 3.Single Image Dehazing via MSCNN-HE 论文阅读
  5. 2022年新高考1卷17题解析
  6. 微信小程序 实现实时语音识别 腾讯云
  7. 【华人学者风采】洪小文 微软亚洲研究院
  8. soul之websocket数据同步
  9. “QQ显示iPhone在线”背后的虚荣与焦虑
  10. 群聊平台、发邮件、发短信