【C++】朝花夕拾——中缀转后缀
对于简单的四则运算而言,后缀表达式可以通过使用栈(stack)快速算出结果
==================================我是分割线====================================
后缀的定义:
e.g. 2 + 3 -> 2 3 +
2 + 3 * 4 -> 2 3 4 * +
应用栈来计算后缀表达式:
e.g. 后缀表达式 6 5 2 3 + 8 * + 3 + *
遍历: 6 push(6) stack: 6
5 push(5) stack: 6 5
2 push(2) stack: 6 5 2
3 push(3) stack: 6 5 2 3
+ pop、pop 2、 3出栈,操作 ans = 2 + 3; push(ans) stack: 6 5 5
8 push(8) stack: 6 5 5 8
* pop、pop 5、 8出栈,操作 ans = 5 * 8; push(ans) stack: 6 5 40
+ pop、pop 5、 40出栈,操作 ans = 5 + 40; push(ans) stack: 6 45
3 push(3) stack: 6 45 3
+ pop、pop 45、 3出栈,操作 ans = 45 + 3; push(ans) stack: 6 48
* pop、pop 6、 48出栈,操作 ans = 6 * 48; push(ans) stack: 288
把中缀表达式转化成后缀表达式:
设定: 优先级 ‘(’ > ‘*’ = ‘/’ > ‘+’ = ‘-’
①读取输入队列的字符,判断是数字还是符号+-*/()
②若是数字,放到输出队列
③若是‘)’,则把stack中的符号一一弹出到输出队列,直到遇到第一个‘(’,且‘(’不用放到输出队列
④若是其他符号+-*/(,则把栈中元素弹出,直到发现优先级更低的符号或者‘(’为止。'('只有在遇到‘)’时才弹出
代码实现:
//2016-03-16
//中缀转后缀 //局限性:输入合法、数字为0~9的范围
#include <iostream>
#include <string>
#include <stack> using namespace std; int main() {
string input, output;
stack<char> operators;
while (cin >> input) {
if (input == "") break;
output.clear();
for (int i = ; i < input.size(); i++) {
char ch = input[i];
if (ch >= '' && ch <= '') output.push_back(ch);
else if (ch == '+' || ch == '-') {
while (!operators.empty() && (operators.top() == '*' || operators.top() == '/' || operators.top() == '-' || operators.top() == '+')) {
output.push_back(operators.top());
operators.pop();
}
operators.push(ch);
}
else if (ch == '*' || ch == '/') {
while (!operators.empty() && (operators.top() == '*' || operators.top() == '/')) {
output.push_back(operators.top());
operators.pop();
}
operators.push(ch);
}
else if (ch == ')') {
while (operators.top() != '(' && !operators.empty()) {
output.push_back(operators.top());
operators.pop();
}
operators.pop();
}
else if (ch == '(') {
operators.push(ch);
}
}
while (!operators.empty()) {
output.push_back(operators.top());
operators.pop();
}
cout << "output : " << output << endl;
}
return ;
}
测试:

局限性:(不够健壮)
①只实现了0~9的数字输入,若是两位以上的数字还需要做字符判断(前一个字符是否是数字,若是,则当前字符和前一位同属一个整数)
②没有做最后的结果计算,因为还是字符串,如果需要,则要做字符到整型的转换判断。
③没有异常检测(假设所有输入都合法,不合法的输入会直接导致错误输出)
一些bugs:
①stack容器内没有clear();
②判断条件while (!operators.empty() && (operators.top() == '*' || operators.top() == '/'))中必须先判断!operators.empty()
否则先判断(operators.top() == '*' || operators.top() == '/')事实上是会做top()的读取操作,此时栈若为空,就会runtime error
【C++】朝花夕拾——中缀转后缀的更多相关文章
- 栈的应用1——超级计算器(中缀与后缀表达式)C语言
这里要学的程序主要用来实现一个功能——输入表达式输出结果,也就是一个计算器.效果如下: 这个程序主要有两个步骤:1.把中缀表达式转换为后缀表达式:2.计算后缀表达式的结果. 首先先明白几个问题: 1. ...
- C语言 中缀转后缀
给定字符串型的算术表达式,实现中缀转后缀并运算得出结果: #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED #include <stdio.h& ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- C++ 中缀转后缀表达式并求值
//中缀转后缀 #include<iostream> #include<stack> using namespace std; int prio(char x){ ; ; ; ...
- Java数据结构和算法(六):前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- java四则运算----前缀、中缀、后缀表达式
接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现 ...
- 洛谷P1981 表达式求值 题解 栈/中缀转后缀
题目链接:https://www.luogu.org/problem/P1981 这道题目就是一道简化的中缀转后缀,因为这里比较简单,只有加号(+)和乘号(*),所以我们只需要开一个存放数值的栈就可以 ...
- PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)
本题考点:中缀表达式转后缀表达式. 难点: 带有小数的数字 数字可能带有正负号 题目描述: 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于 ...
- 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】
比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 - -5.22 ) )与7.5+-3*8/(7+2) windows ...
随机推荐
- jacoco+maven生成单元测试覆盖率报告
参考:https://www.petrikainulainen.net/programming/maven/creating-code-coverage-reports-for-unit-and-in ...
- 复制class文件到as中出现非法字符,须要class,interface货enum
问题如题,出现此情况是在导入eclipse项目到Android Studio出现这种错误, 非法字符: '\ufeff' 解决方式|错误: 须要class, interface或enum,查阅后了解到 ...
- GDI+学习之------ 画线、区域填充、写字
<精通GDI编程>里的代码.在学习过程中对它加以总结,以防以后用到,全部代码都是在MFC 单文档中实现的,写在View::OnDraw(CDC */*pDC*/)中 画线/边框(Pen) ...
- MySQL-插入数据(INSERT)
Insert语句可将一行或多行插入到表中. INSERT语法: INSERT INTO table(column1,column2...) VALUES (value1,value2,...); 首先 ...
- lua-5.2.3编译问题记录"libreadline.so: undefined reference to `PC'"
作者:zhanhailiang 日期:2014-10-21 [root@~/software]# cd lua-5.2.3 [root@~/software/lua-5.2.3]# make linu ...
- luogu1941 飞扬的小鸟
题目大意 游戏界面是一个长为n ,高为 m 的二维平面,其中有k 个管道(忽略管道的宽度).小鸟始终在游戏界面内移动.小鸟从游戏界面最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成.小鸟每个 ...
- 8-23 canvas专题
8-23 canvas专题-了解外部框架的使用 学习要点 掌握画布内容的导出的toDataURL()方法 了解外部框架的使用 第八章内容介绍 在第八章中我们将对以前的知识进行简单的回顾,着重对canv ...
- [Pa2013]Iloczyn
https://www.zybuluo.com/ysner/note/1300802 题面 给定正整数\(n\)和\(k\),问能否将\(n\)分解为\(k\)个不同正整数的乘积. \(n\leq10 ...
- 清北考前刷题da5下午好
/* (4,1)*(3,1)*(2,1)的话1变成2然后一直是2 2变成1然后变成3 3变成1然后变成4 4变成1 */ #include<iostream> #include<cs ...
- sql 索引详解
索引的重要性 数据库性能优化中索引绝对是一个重量级的因素,可以说,索引使用不当,其它优化措施将毫无意义. 聚簇索引(Clustered Index)和非聚簇索引 (Non- Clustered Ind ...