【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 ...
随机推荐
- Redis官网下载步骤(含windows版)
①.百度redis ,进入官网 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- 分析Linux内核的启动过程
第一章 环境 Ubuntu 14.10 Linux Kernel 3.18.6 第二章 代码及调试过程 环境搭建与内核准备: cd ~/LinuxKernel/ wget https://www.ke ...
- Android处理日期
近期做一个项目,后台返回的日期是RFC3339格式的.之前没有看到过,当中遇到了几个问题以及解决 1.2015-11-18T14:49:55Z转换 在SimpleDateFormat中给出了几种格式 ...
- 利用函数计算构建微信小程序的Server端
10分钟上线 - 利用函数计算构建微信小程序的Server端-博客-云栖社区-阿里云 https://yq.aliyun.com/articles/435430 函数计算 读写 oss import ...
- [译]NUnit--Installation(三)
Installation NUnit安装程序默认安装文件路径为C:\Program Files\NUnit 2.6.2.根据用户选择安装的选项,安装文件有三个子文件夹:bin.doc.samples. ...
- [NOI2004]小H的小屋 贪心
神仙贪心,洛谷没有插图导致我题一开始都没看懂.容易发现,块越多越优秀,然后为了满足题意,所以假如不能整除,就分为两个部分(能整除就直接均分就行了).前一部分是n/m,后一部分是n/m+1.数量也是固定 ...
- [国家集训队2]Tree I
https://www.zybuluo.com/ysner/note/1294263 题面 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解 ...
- 洛谷 P1314 聪明的质监员 —— 二分
题目:https://www.luogu.org/problemnew/show/P1314 显然就是二分那个标准: 当然不能每个区间从头到尾算答案,所以要先算出每个位置被算了几次: 不知为何自己第一 ...
- openstack dnsmasq
killall dnsmasq systemctl restart openstack-nova-compute /sbin/dnsmasq --conf-file=/var/lib/libvirt/ ...
- MySQL Archive存储引擎
200 ? "200px" : this.width)!important;} --> 介绍 从archive单词的解释我们大概可以明白这个存储引擎的用途,这个存储引擎基本上 ...