我们这次实现的命令行计算器,支持加减乘除、括号、浮点数、负数,以及查看历史和退出功能。

主要的思路:read - parse - print - loop。

read 阶段是指读取用户在提示符(cal> )之后输入的字符串。

parse 阶段包括:将用户输入的字符串分割成单个对象比如:符号  +,或者数字 1.2 。其次将中缀表达式转化后缀表达式,接下来计算后缀表达式的数值。

print 阶段指的是将 parse 阶段的数值打印在终端上。

loop 阶段是指重复上述操作,除非用户输入 exit 符号或者 Ctrl + C 终止程序运行。

实现效果图:

为了实现后面的中缀、后缀表达式,我们需要借助栈这种数据结构。

栈是一种先进后出的数据结构,函数调用时就会使用栈来保存当前程序的地址及其他信息,前面的深度优先搜索就是基于栈实现的。

之前写了一篇文章介绍了栈的用法,下面简单说明栈的使用:

push 函数在栈的顶部添加元素,pop 函数删除栈顶的元素,top 函数查看栈顶元素。

class Stack:

分词

分词是 parse 阶段的重要部分。

  • 我们定义符号 + - * / ( )。

  • 将这些字符串中的这些符号替换为:空格 + 符号 + 空格

+ => 空格+空格
  • 将字符串按空格分割,得到最终的分词

经过上述操作,就可以实现对正数以及操作符的分词功能。

# Python高效编程    # 分割字符串   seq: List[str] = expression.split()

为了实现对负数的分词,我们需要迭代分词序列,将‘-’ 与后面的数字转换成一个整体。我们有两种情况将 - 视作负号,第一种情况,负号位于字符串的开头;第二种情况,负号前一个符号为左括号。

# Python高效编程

中缀表达式

中缀表达式就是我们写的各种表达式,如 3 + 2 * 4。我们希望将其转化为后缀表达式,示例如下:

=> 

我们需要准备一个栈 stack ,用于临时存放操作符;准备一个序列 seq,用来存放输出结果,也就是后缀表达式。

转化规则:

迭代分词序列,遇到数字,就将数字输出到序列 seq 中。

定义各个符号优先级,其中 乘除 > 加减 > 右括号。比较当前符号与栈顶元素的优先级,如果当前元素的优先级小于等于栈顶元素的优先级,就弹出栈顶元素,输出到 seq 序列中,然后将当前元素压入栈中。如果当前元素的优先级大于栈顶元素的优先级,或者当前元素为右括号,我们直接将当前元素压入栈中。

如果遇到左括号,我们就弹出栈中元素,并输出到 seq 序列中。其中,左右括号不输出到序列中。

最后,将栈中剩余的符号输出到 seq 序列中。

# Python高效编程

代码如下:

# Python高效编程

后缀表达式

后缀表达式的规则:遇到数值就压入栈中;遇到符号,就从栈中弹出两个元素,计算两个元素运算结果,将得到的结果压入栈中。

# Python高效编程

总结

接下来还有添加查看历史和退出功能以及整个程序的组成,关注微信公众号python高效编程在后台回复 2019813获取源代码及 exe 文件。

evaluate函数使用无效_[Python实战]使用栈实现简易计算器相关推荐

  1. evaluate函数使用无效_我用这个Excel函数,秀了同事一脸!很多人却连它名字都没听过...

    最近收到在某快递上班的周同学问题求助,主要是在计算包裹的体积时遇到了些麻烦事. 下表是周同学近期整理的快递包裹尺寸数据,其中重要一项工作就是通过长*宽*高来计算出包裹的体积. 周同学表示其实自己也能做 ...

  2. evaluate函数使用无效_在Matlab中使用tensorflow (2)

    本篇介绍如何在matlab中调用python训练好的网络模型和权重. 系统环境:win10,matlab2018b,python3.6,tensorflow1.1 代码如下: tf = py.impo ...

  3. evaluate函数使用无效_使用Keras和Pytorch处理RNN变长序列输入的方法总结

    最近在使用Keras和Pytorch处理时间序列数据,在变长数据的输入处理上踩了很多坑.一般的通用做法都需要先将一个batch中的所有序列padding到同一长度,然后需要在网络训练时屏蔽掉paddi ...

  4. python画完图 程序暂停运行_[Python实战]你也能写的计时器程序

    文章地址:[Python实战]你也能写的计时器程序 上次,公众号介绍了如何使用 Pyqt5 制作猜数游戏界面,并介绍了如何在 Pycharm 中使用 Qt Designer 生成 UI 文件.这次,我 ...

  5. 基于python:利用pyqt5设计简易计算器

    实训内容: 跟随学习,用python写一个能进行简易运算的计算器,并自己设计计算器的UI界面,并根据实际对外观做出一定的美化. 准备过程 本次使用的是Windows11,python环境3.9.15 ...

  6. python实验指导书答案函数代码复用_#Python学习笔记(5)函数和代码重用,复用

    七段数码管绘制 绘制单段数码管 def drawLine(draw): turtle.pendown() if draw else turtle.penup() #将绘制一条线定义为一个基本函数, 参 ...

  7. python田字格函数简化代码_[Python]使用生成器来简化代码

    原本只是大概知道生成器是什么,但一直不知道怎么用,或是什么情景下用,后来才发现: 在需要一边读数据一边处理任务时,如果直接为每个任务都写一个函数,那么读数据的部分就要在每个函数都重复一遍 直接将所有任 ...

  8. python中complex函数的用法_​Python中complex函数有什么用

    ​Python中complex函数有什么用 发布时间:2020-12-15 09:34:36 来源:亿速云 阅读:71 作者:小新 这篇文章给大家分享的是有关Python中complex函数有什么用的 ...

  9. evaluate函数使用无效_VBA学习笔记5:函数与公式

    学习资源:<Excel VBA从入门到进阶>第六讲 函数与公式 by蓝色幻想 一.在单元格中输入公式 1.用VBA在单元格中输入普通公式 Sub t1()Range("d2&qu ...

最新文章

  1. 指针系统学习7-返回指针值的函数
  2. IOS开发之--UIScrollView pagingEnabled自定义翻页宽度
  3. react滑动切换tab动画效果_[React Native]react-native-scrollable-tab-view(入门篇)
  4. 重磅!Vue3.0终终终于要来了!
  5. 投票列表排序 - 默认,投票数
  6. c++ 捕获所有异常
  7. Chrome扩展开发指南(
  8. 基于单片机的水温液位监测系统设计(#0513)
  9. 海康威视摄像头的多通道rtsp地址格式
  10. linux内top命令,Linux中的top命令的详细解释
  11. 运维——ssh无法登录云服务器
  12. 直流无刷电机及Matlab/Simulink驱动仿真
  13. 时间抖动(jitter)--学习笔记
  14. hive执行报错:Both left and right aliases encountered in JOIN
  15. jdk1.8api中英文版
  16. 信息安全学习4. 重放攻击的概念与防范
  17. 山西计算机教室配备标准,山西省义务教育阶段中小学现代教育技术设备配备标准.doc...
  18. Ubuntu服务器的安装和配置----系统安装
  19. 有难度无危险 强制打开Vista Aero特效
  20. mac可装云服务器_(mac)阿里云ECS服务器配置过程

热门文章

  1. plotly可视化绘制共享坐标轴图
  2. 启动R环境并执行R脚本
  3. 什么是AWS Lambda?
  4. 实体识别+entity resolution
  5. R语言_基本数据管理
  6. 第六章 非编码RNA鉴定
  7. Long-read sequencing for improved analysis
  8. DNA RNA 蛋白质
  9. Go语言学习之旅01--变量与数据
  10. tensorflow 做加法