1、表达式求值

中缀表达式是正常的表达式形式,
例如:4.99 * 1.06 + 5.99 + 6.99 * 1.06
后缀表达式是针对中缀表达式而言的,可以理解为:操作符在两个操作数之后。
例如:4.99 1.06 * 5.99 + 6.99 1.06 * +

表达式的求值规则为:
设两个栈,n,o,分别存储操作数和操作符。
从左到右扫描中缀表达式:
遇到一个操作数,将其压入栈n中;
遇到操作符:(第一个直接入栈n)
1.o栈顶元素优先级小于当前扫描操作符:当前操作符压入栈o。
2.o栈顶元素优先级大于等于当前扫描操作符:取o栈顶操作符和栈n两个元素,计算得到结果再压入栈n,循环直到o栈顶元素优先级小于当前操作符,执行第1条。
遍历完表达式后,要把栈o中操作符全部计算完,此时的栈顶元素即为计算结果。

2、示例解释

4.99 * 1.06 + 5.99 + 6.99 * 1.06
如上的表达式求值过程为:
初始,栈空;
①遇到操作数4.99,入栈n;
②遇到操作符*,第一个直接入栈o;
③遇到操作数1.06,入栈n;
④遇到操作符+,o栈顶操作符优先级高于当前操作符,弹出n栈中两个数(1.06和4.99),并将1.06×4.99的结果5.2894压入栈n,且弹出o栈顶元素“ * ”,此时o栈顶没有比“+”操作符更高优先级的元素,故不用循环比较,直接将“+”压入栈o;
⑤遇到操作数5.99,入栈n;
⑥遇到操作符+,与栈顶元素优先级相同,故计算5.2894+5.99的值11.2794压入栈n,操作同上⑤,直接讲“+”压入栈o;
⑦遇到操作数6.99,入栈;
⑧遇到操作符*,比o栈顶元素优先级高,直接入栈o;
⑨遇到操作数1.06,入栈;
⑩此时栈o不为空,应从o栈顶元素“ * ”开始计算,将1.066.99的结果7.4094压入栈n,弹出“”。
⑪此时栈o仍不为空,元素为“+”,将7.4094+11.2794的结果18.6888压入栈n;
最后o栈为空,结果即为n栈顶元素——18.6888。
(如果还是有点抽象可以画个图理解一下)

3、题目及模板

HDOJ-1237 简单计算器

Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0

Sample Output
3.00
13.36

#include<bits/stdc++.h>
using namespace std;
const int maxn = 300;
stack<double> n;
stack<char> o;
char s[maxn];int priority(char op) {if (op =='+' || op =='-') return 1;if (op =='*' || op =='/') return 2;else return 0;
}
void ope(stack<char> &o, stack<double> &n) {double b = n.top();n.pop();double a = n.top();n.pop();char op = o.top();if (op =='+') n.push(a+b);if (op =='-') n.push(a-b);if (op =='*') n.push(a*b);if (op =='/') n.push(a/b);o.pop();
}double cal() {double temp;for (int i = 0; i < strlen(s)+1; ++i) {if (s[i] == ' ') continue;if (isdigit(s[i])) {temp = 0;while (isdigit(s[i])) {temp = temp*10 + s[i]-'0';i++;}i--;n.push(temp);} else {while (!o.empty() && (priority(o.top()) >= priority(s[i])) && n.size() >= 2) {ope(o, n);}o.push(s[i]);            }}return n.top();
}
int main() {while (cin.getline(s, maxn) != NULL && strcmp(s, "0") != 0) {while (!n.empty()) {n.pop();}while (!o.empty()) {o.pop();}printf("%.2lf\n", cal());}
}

栈的应用——表达式求值(双栈)相关推荐

  1. php表达式求值,PHP实现基于栈的后缀表达式求值功能

    本文实例讲述了PHP实现基于栈的后缀表达式求值功能.分享给大家供大家参考,具体如下: 后缀表达式概述 后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左 ...

  2. c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...

    运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateEx ...

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

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

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

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

  5. 【NYOJ-35】表达式求值——简单栈练习

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(2 ...

  6. 数据结构课程设计---------用栈来实现表达式求值

    1.需求分析 设计一个程序,演示用算符优先法对算术表达式求值的过程.利用算符优先关系,实现对算术四则混合运算表达式的求值. (1)输入的形式:表达式,例如2*(3+4)      包含的运算符只能有' ...

  7. 基于栈的后缀表达式求值(洛谷P1449题题解,Java语言描述)

    题目要求 P1449题目链接 分析 给出后缀表达式求值,就相当于没了括号,而且很直接. 我们需要使用栈结构来完成任务. Java原装的栈使用了很多synchronized,导致性能不佳,但我们也就将就 ...

  8. 【Java】基于栈的算术表达式求值

    定义异常类 public class ExpressionException extends RuntimeException {private static final long serialVer ...

  9. 栈的应用——表达式求值

    概要 表达式求值问题可以说是一个经典问题.具体思路就是首先把输入的中缀表达式转换为后缀表达式,然后再根据后缀表达式进行计算求值. 中缀表达式转换为后缀表达式 首先我们设定运算符在进栈前与进栈后的优先级 ...

最新文章

  1. python流程控制语句-python 流程控制语句
  2. 儿童手工制作日历_怎么做手工儿童卡通绵羊日程管理小日历
  3. java 多线程语法_Java基础语法之多线程学习笔记整理
  4. Unix/Linux 中的 shell 机制
  5. JDK和IDEA的安装(JDK11及以上版本自带JRE)
  6. java语言程序设计基础篇课后答案_《Java语言程序设计:基础篇》课后复习题答案-第十五章.pdf...
  7. 应用HTK搭建语音拨号系统2:创建单音素HMM模型
  8. 感知机算法—推导收敛次数的上界
  9. #洛谷oj:P1196银河英雄传说
  10. 基于MATLAB的答题卡识别系统
  11. WiFi密码破解详细图文教程
  12. NRF52832-DFU升级-蓝牙抓包数据解析
  13. vue3.0 结合element ui 开发后台ui框架
  14. 苹果摊上事了,iPhone 13新机大翻车,坑害无数人
  15. “科林明伦杯”哈尔滨理工大学第十届部分题解
  16. dividing(多重背包)
  17. QT状态栏(statusbar)用法
  18. 2023中国矿业大学计算机考研信息汇总
  19. 浪潮服务器怎么重做raid 、设置pxe 启动
  20. VC :在对话框中绘图

热门文章

  1. Spark Scalaa 几个常用的示例
  2. 一周总结汇总_2016-09-18
  3. PHP如何判断一个数组是一维数组或者是二维数组?用什么函数?
  4. javascript设计模式——Publish/Subscribe
  5. Scrapy_CSS选择器
  6. MySql、PowerDesigner、JDBC 的关系
  7. c语言和c 编程的区别吗,C语言和C有什么区别呀?
  8. idea常用快捷键设置
  9. 学习php开发步骤,学习php设计模式 php实现模板方法模式
  10. 关于(我们流量表优化),分区表数据块过多,聚合又导致数据倾斜问题