前面我们已经关于计算器介绍的已经够多了,那么它现在还是没有具备计算的功能。今天我们来继续讲解计算器的解析算法,那么对于一个四则运算表达式,
它是如何读懂的呢?比如:“+9.11 + ( -3 - 1 ) * -5 ”;人类习惯的数学表达式叫做中缀表达式,还有一种将运算符放在数字后面的后缀表达式,
比如:5 + 3 ==> 5 3 +; 1 + 2 * 3 ==> 1 2 3 * +;像这种就是后缀表达式。那么中缀表达式是符合人类的阅读和思维习惯,后缀表达式则符合计算机的运算方式,
这是一种消除了中缀表达式中的括号,同时保留中缀表达式中的运算优先级。解决方案就是:1、将中缀表达式进行数字和运算符的分离2、将中缀表达式转换为后缀表达式3、通过后缀表达式计算最终结果所要计算的中缀表达式中包含1、数字和小数点【0 - 9 或 . 】2、符号位【 + 或 - 】3、运算符【+,-,/, * 】4、括号【 (或)】具体的思想就是以符号作为标志对表达式中的字符逐个访问1、定义累计变量 num2、当前字符 exp[i] 为数字或小数点时:累计:num += exp[i];3、当前字符 exp[i] 为符号时:num 为运算数,分离并保存;若 exp[i] 为正负号:累计符号位 + 和 - : num += exp[i];若 exp[i] 为运算符:分离并保存;用伪代码描述出来就是这样:


我们接下来分析下这个分离算法的难点在哪?当然是如何区分正负号与加号和减号。我们可以这样想:正+ 和 负- 在表达式的第一个位置;括号后的 正+ 和 负- ;运算符后的 正+ 和 负-;

    具体代码则为:

QQueue<QString> QCalculatorDec::split(const QString& exp)
{
QQueue<QString> ret;
QString num = "";
QString pre = "";

for(int i=0; i<exp.length(); i++)
{if( isDigitOrDot(exp[i]) )  // 判断是否为数字0-9或小数点.{num += exp[i];pre = exp[i];}else if( isSymbol(exp[i]) ) // 如果是符号{if( !num.isEmpty() )    // 数组不为空{ret.enqueue(num);num.clear();}if( isSign(exp[i]) && ((pre == "") || (pre == "(") || isOperator(pre)) )    // 如果是正负号或者()或操作符{num += exp[i];}else{ret.enqueue(exp[i]);}pre = exp[i];}
}if( !num.isEmpty() )
{ret.enqueue(num);
}return ret;

}

我们在构造函数里设置如下:


那么我们构建运行完得到的结果如下:

那么我们可以看到计算器正确的识别了四则表达式,今天我们就先学习到这了。后面我们接着继续计算器的解析算法的学习。

转载于:https://blog.51cto.com/12810168/2088766

QT之计算器对四则运算表达式的解析(九)相关推荐

  1. 练习:Python 的字符串处理, 一个朴实无华的四则运算计算器,批量计算小学生四则运算表达式

    Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基础那么简单-- My CS ...

  2. c语言编程实现二进制计算器,本程序是用纯C语言编的一个基于命令行的四则运算计算器。主要用于计算四则运算表达式的值,同时可以实现四...

    本程序是用纯C语言编的一个基于命令行的四则运算计算器.主要用于计算四则运算表达式的值,同时可以实现四 2016-08-22 0 0 0 暂无评分 其他 1 积分下载 如何获取积分? 本程序是用纯C语言 ...

  3. c语言整数四则运算表达式的输出格式控制,四则运算

    网页简易四则运算器2021-05-18 22:35:40 下载地址:https://download.csdn.net/download/qq_31293575/18340399 项目介绍 Calcu ...

  4. C++实现对数学基本运算表达式的解析

    代码地址如下: http://www.demodashi.com/demo/11078.html 前段时间在LeetCode上刷题,遇到了很多涉及对字符串进行解析的题目.可能是出于这个原因,最近迷恋上 ...

  5. 简易计算器:算术表达式的计算

    给出一组字符表达式,通过程序模拟计算器执行,最终得出运算结果.(没有考虑数字溢出场景) 输入:"60 + 34 * 2 / 4 – 5" 输出:72 存储示例:str {" ...

  6. 4 三元表达式 列表解析 生成器表达式

    三元表达式 #!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @File : 三元表达式 # @Version : 1.0'''三元表达式能实现简单的 i ...

  7. 干货!表达式树解析框架(3)

    最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 这应该是年前最后一篇了,接下来的时间就要陪陪老婆孩子了 关于表达 ...

  8. c语言整数四则运算表达式的输出格式控制,Educoder CC++基本输入输出

    第1关:重要的事情说三遍 1.这里结合的一个具体场景是:程序接受一个输入字符,然后将该字符输出三遍,再输出一个!. // 包含标准输入输出函数库 #include // 定义main函数 int ma ...

  9. JSP页面EL表达式不解析

    转载自  JSP页面EL表达式不解析 问题是这样:在搭建springMVC环境的时候,笔者写了一个简单的Controller如下: @Controller public class HelloCont ...

  10. 三元表达式列表解析生成器表达式

    三元表达式 列表解析 生成器表达式 三元表达式 在作简单的判断时,三元表达式能简化代码: def max(x, y):if x > y:return xelse:return y # 这个函数可 ...

最新文章

  1. left join 不重复_R语言ETL工程:连接(join)
  2. 一个公式、五大指标帮你构建产品经理数据分析思维
  3. MySQL调优(二):数据类型和schema优化,MySQL8.0取消查询缓存的原因
  4. 【转】无法打开登录所请求的数据库 xxxx。登录失败。 用户 'xxxxx' 登录失败。...
  5. JavaScript Promise 快速入门
  6. 阿里云环境迁移记录 - RabbitMQ集群搭建
  7. 实验一 单片机 绘制原理图
  8. Python数据库sqlite3详解
  9. java 开发脚本视频_你写脚本,AI自动剪视频:13分钟完成剪辑师7小时创作
  10. win10连上wifi却上不了网
  11. 出现Ncat: bind to 0.0.0.0:9999: Address already in use. QUITTING.如何解决?
  12. 基于Springboot + Thymeleaf 的招聘网站(源代码+数据库) 026
  13. WiFi DFS(动态频率选择)
  14. 【R语言科研绘图】--- 柱状图
  15. chirp和tone burst信号激励
  16. MySQL的数据类型 .
  17. 企业管理需要的启示:没有任何借口
  18. 解决运行gazebo时出现“[gazebo-2] process has died [pid 7920, exit code 255.....“的问题
  19. 资产盘点帐实相符的条码录入Excel方法
  20. MacBookPro德语键盘编程常用符号

热门文章

  1. eclipse bookmark的使用
  2. 由于应用程序配置不正确
  3. Vue学习之路---No.5(分享心得,欢迎批评指正)
  4. 架构之美阅读笔记06
  5. SQL拼接自己需要的字符串
  6. 推荐使用MEF降低耦合(2)
  7. 可以掉落和滑动的星星
  8. SharePoint Designer中无法显示任何列表
  9. 对应版本_DNF:韩服新增天域之母等13件特殊史诗,老版本装备全部直升100级
  10. python获取日期的年月日_python datetime和time的一些疑惑解答 及 获取上年同期、上月等日期...