对于简单的四则运算而言,后缀表达式可以通过使用栈(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. 栈的应用1——超级计算器(中缀与后缀表达式)C语言

    这里要学的程序主要用来实现一个功能——输入表达式输出结果,也就是一个计算器.效果如下: 这个程序主要有两个步骤:1.把中缀表达式转换为后缀表达式:2.计算后缀表达式的结果. 首先先明白几个问题: 1. ...

  2. C语言 中缀转后缀

    给定字符串型的算术表达式,实现中缀转后缀并运算得出结果: #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED #include <stdio.h& ...

  3. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  4. C++ 中缀转后缀表达式并求值

    //中缀转后缀 #include<iostream> #include<stack> using namespace std; int prio(char x){ ; ; ; ...

  5. Java数据结构和算法(六):前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  6. java四则运算----前缀、中缀、后缀表达式

    接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现 ...

  7. 洛谷P1981 表达式求值 题解 栈/中缀转后缀

    题目链接:https://www.luogu.org/problem/P1981 这道题目就是一道简化的中缀转后缀,因为这里比较简单,只有加号(+)和乘号(*),所以我们只需要开一个存放数值的栈就可以 ...

  8. PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)

    本题考点:中缀表达式转后缀表达式. 难点: 带有小数的数字 数字可能带有正负号 题目描述: 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于 ...

  9. 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】

    比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 -  -5.22 ) )与7.5+-3*8/(7+2) windows ...

随机推荐

  1. Java总结之网络

    [网络基础概念] 什么是计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机能够方便的互相传递信息,共享硬件.软件.数据信息等资源 ...

  2. mybatis中批量插入数据

    <insert id="insertIntoDevAct" parameterType="java.util.List"><foreach c ...

  3. android开发真机调试 相关东东

    android开发真机调试 相关东东 我们做android开发的时候,可以用模拟器,也可以真机调试,但是电脑配置不高的话,模拟器,真的是慢的有的一说,所以我一直倾向于用真机调试,但是问题也就来了,模拟 ...

  4. hdu1115 Lifting the Stone(几何,求多边形重心模板题)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=1115">http://acm.hdu.edu.cn/showproblem.php ...

  5. HDU4267 树状数组 不连续区间修改(三维)

    A Simple Problem with Integers                                  Problem Description Let A1, A2, ... ...

  6. projecteuler----&gt;problem=12----Highly divisible triangular number

    title: The sequence of triangle numbers is generated by adding the natural numbers. So the 7th trian ...

  7. 协议解析Bug分析

    协议解析Bug分析 源自邮件协议RPC(远程过程调用)处理的Request请求数据包的bug.        一.Bug描写叙述 腾讯收购的Foxmailclient能够作为outlookclient ...

  8. #1543 : SCI表示法

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 每一个正整数 N 都能表示成若干个连续正整数的和,例如10可以表示成1+2+3+4,15可以表示成4+5+6,8可以表示成 ...

  9. 自定义的Notification

    要创建一个自定义的Notification,可以使用RemoteViews.要定义自己的扩展消息,首先要初始化一个RemoteViews对象,然后将它传递给Notification contentVi ...

  10. missing required source folder

    Eclipse 中XXX is missing required source folder 问题的解决 https://blog.csdn.net/itzhangdaopin/article/det ...