自娱自乐:

大概是了解了一下前缀、中缀、后缀表示法是啥,并没有去深究,比如考虑实现啊,然后Calculation类里面的计算方法还是选用原来的直接对中缀表达式求值,只是把代码改得规范点,以上。

各表示法:

  • 中缀表示法:

    中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4)。与前缀表达式(例:+ 3 4)或后缀表达式(例:3 4 +)相比,中缀表达式不容易被电脑解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。
    与前缀或后缀记法不同的是,中缀记法中括号是必需的。计算过程中必须用括号将操作符和对应的操作数括起来,用于指示运算的次序。

  • 前缀表示法:

    波兰表示法(Polish notation,或波兰记法),是一种逻辑、算术和代数表示方法,其特点是操作符置于操作数的前面,因此也称做前缀表示法。如果操作符的元数(arity)是固定的,则语法上不需要括号仍然能被无歧义地解析。

  • 后缀表示法:

    逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。

举例说明:

  • '(3 + 4) × 5 - 6' 中缀
  • '- × + 3 4 5 6' 前缀
  • '3 4 + 5 × 6 -' 后缀

我们所习惯的表示法自然是中缀,但是对计算机来说,对后缀和前缀表达式进行计算要比中缀来得容易,因为相比后者带有括号,前面两个的运算优先级要好处理的多(感觉就是按优先级写的)。比如计算后缀表达式,只要从左到右遍历,遇到数字就入栈,遇到运算符就弹出两个数字运算,再把结果入栈,直到表达式末尾。像上面的例子,3、4入栈,遇到加号,弹出4、3相加,再把7入栈,接下来5入栈,遇到乘号,弹出5、7相乘,再把结果35入栈,继续6入栈,遇到减号,弹出6、35,计算35-6(大概要注意哪个减哪个),就得到结果啦。前缀也差不多,就是遍历的顺序啥的是相反的。

转化方法:

将中缀表达式转换为前缀表达式:

遵循以下步骤:

  • (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
  • (2) 从右至左扫描中缀表达式;
  • (3) 遇到操作数时,将其压入S2;
  • (4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
    + (4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;
    + (4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;
    + (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
  • (5) 遇到括号时:
    + (5-1) 如果是右括号“)”,则直接压入S1;
    + (5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃;
  • (6) 重复步骤(2)至(5),直到表达式的最左边;
  • (7) 将S1中剩余的运算符依次弹出并压入S2;
  • (8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。

大概就是按照中缀的运算的优先级来写的,那些括号啊啥的,反正感觉很麻烦,我是没有去深究,这里也就只贴一个,参考的链接在这:点我

表达式树:

表达式好像还可以用二叉树来表示,比如:a+b*(c-d)-e/f,可以表示为下图的二叉树:

感觉也可以理解,直观上觉得很有道理的样子,然后据说不同的树的遍历方式,就能得到那三种表达式。

树的遍历:

下面以二叉树为例,也适用于其他树。

与那些基本上都有标准遍历方式(通常是按线性顺序)的线性数据结构(如链表、一维数组)所不同的是,树结构有多种不同的遍历方式。从二叉树的根节点出发,节点的遍历分为三个主要步骤:对当前节点进行操作(称为“访问”节点)、遍历左边子节点、遍历右边子节点。这三个步骤的先后顺序也是不同遍历方式的根本区别。

由于从给定的某个节点出发,有多个可以前往的下一个节点(树不是线性数据结构),所以在顺序计算(即非并行计算)的情况下,只能推迟对某些节点的访问——即以某种方式保存起来以便稍后再访问。常见的做法是采用栈(LIFO)或队列(FIFO)。

遍历方式的命名,源于其访问节点的顺序。最简单的划分:是深度优先(先访问子节点,再访问父节点,最后是第二个子节点)?还是广度优先(先访问第一个子节点,再访问第二个子节点,最后访问父节点)?

深度优先可进一步按照根节点相对于左右子节点的访问先后来划分。如果把左节点和右节点的位置固定不动,那么根节点放在左节点的左边,称为前序(pre-order)、根节点放在左节点和右节点的中间,称为中序(in-order)、根节点放在右节点的右边,称为后序(post-order)。对广度优先而言,遍历没有前序中序后序之分:给定一组已排序的子节点,其“广度优先”的遍历只有一种唯一的结果。

深度优先搜索的前序、中序、后序遍历得到的表达式就对应前缀、中缀、后缀表达式,大概,然后上面那么官方的东西自然不是我写的,来自维基百科。

顺便附带:

也去看了看命令行,感觉是个很厉害的东西,但是我还不会用它做什么很厉害的事。大概就是会到各个目录里,创建目录,删除目录之类,还发现了一个比较文件不同的命令,感觉计算器第三步说不定可以用来检验输出文件。这里给出一个感觉不错的教程:链接

c++计算器后续(2)的更多相关文章

  1. 使用HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)

    之前发布了一款简易的计算器,今天做了一下修改,添加了键盘监听事件,不用再用鼠标点点点啦 JS代码: var yunSuan = 0;// 运算符号,0-无运算;1-加法;2-减法;3-乘法;4-除法 ...

  2. c++计算器后续(5)

    自娱自乐: 大概是重新开始玩qt,然后MFC和第四步附加的作业大概不会去玩了.以上. QT相关: 阶段一: 原来作业里举了qt和mfc这两个做界面的东西,网上都说qt容易上手,学了mfc再来看qt简直 ...

  3. c++计算器后续(4)

    自娱自乐: 大概是终于做到没做完的部分了,第三步助教学长的评论还没去改,感觉那个把读取文件放到Scan里面比较麻烦,其他大概还好.以上. 文件读写: 先是原来的残留问题,都是和fstream :: o ...

  4. c++计算器后续(3)

    自娱自乐: 本来只是想改改第二次的代码规范的,然后好像把原来的代码玩坏了,真是尴尬...然后大概是又发现了一些东西.以上. main的参数: 大概是说main函数的括号里是可以带参数的,写成这个样子: ...

  5. c++计算器后续(1)

    自娱自乐: 大概是一直在说的代码规范,大概是玩一玩,以上. 代码规范: 参考原文:链接 相关节选: 4 程序的版式 4.4规则:较长的语句(>80字符)要分成多行书写. 4.5规则:不允许把多个 ...

  6. 微信小程序计算器后后续

    改的眼睛都要瞎了,总算是知道问题出哪了 最后一段 在等号里面计算输入的数组,这个判断的主要操作是将输入的数据的数组进行数和符号的拆分然后再计算,把数按字符串输入数组,然后将数和符号进行拆分 ,最后通过 ...

  7. 微信小程序计算器模拟后续

    今天按着自己的思路又重打了一遍 wxml没什么说的,就是分块起名,显示数字和结果的作为屏幕,数字键盘一行四块 <view class="onTop"> <view ...

  8. 【IOS开发笔记03-视图相关】简单计算器的实现

    UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...

  9. Js函数初学者练习(一)switch-case结构实现计算器。

      前  言 JRedu 给大家介绍一点JS函数的练习题希望初学者多做一些练习能够更好的掌握JS的函数,以及能够提升大家的逻辑思维.(我也是个渣渣希望路过的大神多提建议或意见) 希望能够对大家有所帮助 ...

随机推荐

  1. 服务器php启动

    php.ini放在--with-config-file-path设置路径下lib文件夹中才找的到!!!! fpm的配置文件需要放在这个位置/usr/local/etc/php-fpm.conf,暂时不 ...

  2. java并发编程(9)内存模型

    JAVA内存模型 在多线程这一系列中,不去探究内存模型的底层 一.什么是内存模型,为什么需要它 在现代多核处理器中,每个处理器都有自己的缓存,定期的与主内存进行协调: 想要确保每个处理器在任意时刻知道 ...

  3. 转:详解PV、UV、VV、IP及其关系与计算

    一.什么是PV? PV即Page View,网站浏览量,指页面浏览的次数,用以衡量网站用户访问的网页数量.用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计.一般来说,PV与来访者的数量 ...

  4. [LeetCode]Longest Substring Without Repeating Characters题解

    Longest Substring Without Repeating Characters: Given a string, find the length of the longest subst ...

  5. Redis-跳跃表

    相当于Redis 中的 sorted set 跳跃表节点结构: typedef struct zskiplistNode { struct zskiplistNode *backward;  //后退 ...

  6. 使用Mac自带svn搭建服务器,并使用idea进行连接

    一.检查Mac自带SVN版本号 二.创建代码仓库 $ mkdir -p /Users/Shared/svn/repository $ svnadmin create /Users/Shared/svn ...

  7. IDEA使用maven建web项目示例

    运行环境:OSX-10.13.3. IDEA-2017.3.3. maven-3.5.2 步骤1:选择maven-webapp模板新建web项目 步骤2:设置项目GroupId等 需从网上下载相关构件 ...

  8. js-js的不重载

    * 什么是重载?方法名相同,参数列表不同 - Java里面有重载 * js里面不存在重载! <html> <head> <title>World</title ...

  9. [APIO2018] Circle selection 选圆圈(假题解)

    题面 自己去\(LOJ\)上找 Sol 直接排序然后\(KDTree\)查询 然后发现\(TLE\)了 然后把点旋转一下,就过了.. # include <bits/stdc++.h> # ...

  10. JavaScript Standard Style

    这是 JavaScript standard 代码规范的全文. 掌握本规范的最好方法是安装并在自己的代码中使用它. https://github.com/standard/standard/blob/ ...