算术表达式求值

中缀表达式

我们平时写的计算式的式子一般是这样子

格式:"操作数1  操作符  操作数2"12 * (3 + 4) - 6 + 8 / 2;  // 中缀表达式

中缀表达式如果要先计算操作符优先级低的两个数,比如上面要优先计算3+4,这里就必须带括号,指明计算的优先级,负责就会按照操作符默认的优先级来计算。

后缀表达式(逆波兰表达式)

上面的中缀表达式转换为后缀表达式即

格式:"操作数  操作符"
12 3 4 + * 6 - 8 2 / +; //后缀表达式

怎样把中缀表达式转换为后缀表达式,在下面解释,这里先看看后缀表达式是如何计算的呢?

后缀表达式如何计算表达式

这里栈就派上用场了,从左到右一个个遍历表达式,遇到操作数就入栈,遇到操作符就依次取出栈顶的两个操作数进行计算,并把计算结果入栈,供后面计算,直到栈为空,说明表达式计算完毕,否则说明表达式有问题。过程如下图: 

这样就可以按照操作符顺序计算,不用担心操作符优先级还要加大括号的问题。

那如何把中缀表达式转换为后缀表达式

  • 思想:
  1. 从中缀表达式中从左往右依次取出数据
  2. 如遇到操作数,直接输出到后缀的队列里。
  3. 如果遇到操作符(包括括号),这里再定义一个存放操作符的栈,则:
    i.如果操作符是'(',入栈
    ii.如果操作符是')',则把栈里的操作符依次出栈并插入到后缀序列后面,直到遇到')'.
    iii.如果操作符不是‘(’和‘)’,则:
         (1). 如果操作符的优先级比top的优先级高,则入栈
         (2).如果操作符优先级等于或小于top优先级,则将top出栈并插入到后缀序列后面,pop后,再比较栈顶元素的优先级,重复iii,直到把此操作符      插入,将此操作符入栈。
  4. 如果中序队列里的数据已经读取完毕,记录操作符的栈里,还有操作符的话,依次出栈插入到后缀序列的后面。
    此时中缀就已经转换为后缀表达式,如下图

代码实现链接:点击打开github

【经典算法】-算术表达式求值相关推荐

  1. 《Algorithms》—— Dijkstra 的双栈算术表达式求值算法

    想当年学数据结构的时候,一直觉得这个是我一辈子都搞不懂的一个东西.现在看看...还挺简单的... 重点在于如何解析由括号.运算符和数字组成的字符串,并按照正确的顺序完成各种初级算术操作.利用了两个栈( ...

  2. 北京林业大学数据结构实验二 基于栈的算术表达式求值算法

    第1关:基于栈的中缀算术表达式求值 参见课本P75 例3.3 #include <iostream> #include<iomanip>#define MAXSIZE 100 ...

  3. 编程题实训-实验2-基于栈的算术表达式求值算法(北京林业大学)

    第1关:基于栈的中缀算术表达式求值 任务描述 本关任务:输入一个中缀算术表达式,求解表达式的值.运算符包括+.-.*./.(.).=,参加运算的数为double类型且为正数.(要求:直接针对中缀算术表 ...

  4. c语言作业算术表达式求值,算术表达式求值演示(C语言版)

    //头文件预处理命令 #include #include //----------函数结果状态代码----------------- #define TRUE 1 #define FALSE 0 #d ...

  5. 数据结构—— 基于二叉树的算术表达式求值

    实验五 基于二叉树的算术表达式求值 数据结构--中序表达式求值(栈实现) 实验目的: 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法. 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于 ...

  6. 算术表达式求值(C语言栈)

    题目:算术表达式求值 题目描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子.设计一个程序,演示用运算符优先法对算数表达式求值的过程. 基本要求:以字符序列的形式从终端输入语 ...

  7. 【数据结构】栈的应用-算术表达式求值#数据结构实验任务书

    实验题目:栈的应用-算术表达式求值 正文 实验环境: Visual C++ 2010 实验目的: 1.掌握栈的定义及实现: 2.掌握利用栈求解算术表达式的方法. 实验内容: 通过修改完善教材中的算法3 ...

  8. 栈实现算术表达式求值

    算术表达式求值 利用栈求解的一个典型的问题是算术表达式求值,例如:"3+4*2-(1+1)#",这样的表达式计算,在计算过程中,不是读到一个运算就立即计算,而是要与后面的运算符进行 ...

  9. python 表达式求值_简单算术表达式求值

    本文主要探讨简单的数学算术表达式求值算法的原理和实现. 1. 约束 本文只是探讨简单的算术表达式的求值算法,为了将主要精力放在算法思想的探讨和实现上,避免陷入对其他不是直接相关的细节的过多思考,所以提 ...

最新文章

  1. ORBSLAM-Altas:多地图SLAM
  2. excel相乘再相加_excel将两组数据相乘后再求和该怎么操作?
  3. Powershell 渗透测试工具-Nishang
  4. python接入微信公众号_Python学习之微信公众号接入 一 验证
  5. “腾讯电竞”向前,“腾讯游戏”向后
  6. 系统即将关机请保存关机是由nt_设置Windows电脑自动关机
  7. tools URL 收集
  8. java 读取栅格,提取两个重叠栅格的数据
  9. 《51单片机应用开发从入门到精通》——1.3 Keil uVision2集成开发环境
  10. 杭电 HOJ 3038 How Many Answers Are Wrong 解题报告
  11. javaweb教程 javaweb项目路径总结
  12. DDD领域驱动设计 思维导图
  13. 1984年图灵奖--尼克劳斯·沃思简介
  14. Linux笔记一:Linux基本命令
  15. mp3转成m4a的简单方法介绍
  16. mysql重启数据库实例命令_mysql重启数据库实例命令
  17. 机器视觉——光源介绍
  18. JavaScript中函数上下文this指向问题#面试常见读代码
  19. eosjs 文档(浏览器)
  20. 医院项目-预约挂号-第五部分

热门文章

  1. 【Python】SEBS模型计算蒸散发
  2. C# 实时监控线程类
  3. bash管道符开启子进程
  4. 主持人大赛计算机专业,计算机系主持人大赛简报
  5. 32岁健身教练转行程序员,拿到年薪76万offer,这位大龄码农的经历引发热议
  6. android里qq登录界面,Android仿QQ登陆窗口实现原理
  7. 一文看懂个税2022
  8. 简单教学管理系统画E-R关系图
  9. 关于android(安卓)模拟器加速
  10. 2019小米java开发