一、从应对考试角度来(在最快的时间内得出最准确的答案)

首先我们应该知道,要想将中缀转化为后缀,需要借助堆栈实现。(不准备画图了,画图有点浪费时间)我会用最简单明了的语言使读者弄懂。[举个例子吧:比如将:2*(9+6/3-5)+4转化为后缀表达式2 9 6 3 / +5 -  * 4 +    ]

1、任何中缀表达式都由运算数,运算符,括号(大,中,小),这三部分组成。

2、从中缀表达式的左边开始扫描(脑中自己想像的),若遇到运算数时,则直接将其输出(不压入堆栈)。

3、若遇到左括号,则将其压栈。

4、若遇到右括号,表达括号内的中缀表达式已经扫描完毕。这时需将栈顶的运算符依次弹出并输出,直至遇到左括号[左括号弹出但不输出]。

5、若遇到的是运算符:a、如果该运算符的优先级大于栈顶运算符的优先级时,将其压栈

b、如果该运算符的优先级小于栈顶运算符的优先级时,将栈顶运算符弹出并输出,接着和新的栈顶运算 符比较,若大于,则将其压栈,若小于,继续将栈顶运算符弹出并输出......(一直递归下去,直至运算符大于栈顶云算符为止)。

6、最后一步,若扫描到中缀表达式的末尾[即扫描结束],若堆栈中还有存留的运算符依次弹出并输出即可。

原文:https://blog.csdn.net/coder_dacyuan/article/details/79941743

CODE:

/*
中缀转后缀C++代码实现(比较方便)
1.遇到操作数:添加到后缀表达式中或直接输出
2.栈空时:遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,输出到后缀表达式,直到弹出的是左括号
注意:左括号不输出到后缀表达式
5.遇到其他运算符:弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈
6.将栈中剩余内容依次弹出后缀表达式
*/#include<iostream>
#include<stack>
#include<queue>
#include<map>
#include<string>
#include<cstdio>
#define MAX 100
using namespace std;//设置优先级(注意默认操作数的优先级最高,即其不需要进栈,进栈的都是运算符)
map<char, int> p;//一些初始化********************************************
struct Node{double num;//操作数char op;//操作符bool flag;//true表示操作数,false表示操作符
};
typedef struct Node node;stack<node> s;//操作符栈
stack<node> s1;//存放操作数的,为了计算后缀表达式的值
queue<node> q;//后缀表达式队列//******************************************************
//中缀转后缀函数
void change(string str){node temp;for (int i = 0; i < str.length();){if (str[i] == '('){//3.遇到左括号:将其入栈temp.flag = false;temp.op = str[i];s.push(temp);i++;}else if (str[i] == ')'){//4.遇到右括号:执行出栈操作,输出到后缀表达式,直到弹出的是左括号while (!s.empty() && s.top().op != '('){q.push(s.top());s.pop();}s.pop();//弹出左括号i++;}else if (str[i] >= '0'&&str[i] <= '9'){//如果是数字temp.flag = true;temp.num = str[i] - '0';i++;//后移一位,因为数字不一定是个位数while (i < str.length() && str[i] >= '0'&&str[i] <= '9'){temp.num = temp.num * 10 + (str[i] - '0');i++;}q.push(temp);//操作数进入后缀表达式}else{//如果是操作符//5.遇到其他运算符:弹出所有优先加大于或等于该运算符的栈顶元素,然后将该运算符入栈temp.flag = false;while (!s.empty() && p[s.top().op] >= p[str[i]]){q.push(s.top());s.pop();}temp.op = str[i];s.push(temp);i++;}}//6.将栈中剩余内容依次弹出后缀表达式while (!s.empty()){q.push(s.top());s.pop();}
}//*************************************************************
//后缀表达式的计算
/*
从左到右扫描后缀表达式
1)若是操作数,就压栈,
2)若是操作符,就连续弹出两个操组数
3)栈顶的值即为所需结果
注:先弹出的是第一操作数,后弹出的是第二操作数
*/
double  calculate(){double num_a, num_b;//操作数a,bnode cur, temp;while (!q.empty()){//后缀队列非空cur = q.front();//记录队首元素q.pop();if (cur.flag == true){//是操作数进入栈s1.push(cur);}else{//是操作符就运算num_b = s1.top().num;s1.pop();//弹出第二操作数num_a = s1.top().num;s1.pop();//弹出第一操作数temp.flag = true;if (cur.op == '+'){temp.num = num_a + num_b;}else if (cur.op == '-'){temp.num = num_a - num_b;}else if (cur.op == '*'){temp.num = num_a * num_b;}else{temp.num = num_a / num_b;}s1.push(temp);//把计算后的结果再次压栈}}return s1.top().num;}
//*************************************************************int main()
{string str;p['+'] = p['-'] = 1;//通过hashmap赋值p['*'] = p['/'] = 2;cin >> str;change(str);//*****************************************************//中缀转后缀/*while (!q.empty()){cur = q.front();if (cur.flag == true) cout << cur.num << " ";else cout << cur.op << " ";q.pop();}*/while (!s1.empty()){//初始化栈s1s1.pop();}double answer=calculate();cout << answer<<endl;return 0;
}

  

转载于:https://www.cnblogs.com/zhangbuang/p/11177898.html

中缀表达式转化为后缀表达式相关推荐

  1. 将中缀表达式转化为后缀表达式

    我们把平时所用的标准四则运算表达式,即"9+(3-1)*3+10/2"叫做中缀表达式.因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化. 中缀表达式" ...

  2. 2015中缀表达式转化为后缀表达式(C++,附思路,注释多)

    这篇文章默认你已经知道转换的原理了,所以就不介绍如何转换了~如果不知道的话可以看这两篇文章,写得很好,可以看懂~ 详解如何将中缀表达式转化为后缀表达式_Dacyuan的学习笔记-CSDN博客_中缀算式 ...

  3. [数据结构考前必看]中缀表达式转化成后缀表达式_例题超多+分步骤讲解+带你手算

    中缀.后缀表达式定义 中缀表达式又称波兰式,有利于人们阅读与表达. 后缀表达式又称逆波兰式,有利于机器进行运算. 例题1: 中缀表达式:(a+b+c*d) /e 首先让我们来看一下运算符对应的优先级, ...

  4. 利用栈将中缀表达式转化成后缀表达式

    目的:将中缀表达式(即标准形式的表达式)转换为后缀式. 例子:a+b*c+(d*e+f)*g转换成abc*+de*f+g*+ 转换原则 1. 遇到操作数, 直接输出 2. 操作符的优先级为 () 最大 ...

  5. 把中缀表达式转化为后缀表达式

    http://www.cppblog.com/yearner/archive/2006/10/31/14425.html 算法的用途: 我的目的很简单,做一个24点牌的Flash小游戏,接受用户输入的 ...

  6. java后缀表达式_表达式计算 java 后缀表达式

    题目: 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例 ...

  7. 前缀表达式计算、中缀表达式计算、后缀表达式计算

    首先要知道什么是前缀表达式,什么是中缀表达式,什么是后缀表达式 所谓的中缀表达式就是类似于这种的运算 1+((2+3)×4)-5 所谓的前缀表达式就是符号在两个操作数的前面 - + 1 × + 2 3 ...

  8. c语言表达式的后缀,中缀表达式转换成后缀表达式C语言程序(一)

    逆波兰表达式(Reverse Polish Notation)又叫后缀表达式.它是一种非常的表达式,可以将复杂的表达式转换成可以依靠简单的操作得到结果的表达.下面这段C语言即是用于实现将中缀表达式转换 ...

  9. NYOJ 257 中缀表达式表示成后缀表达式

    话说这道题代码那个丑陋啊,,写出来我自己都不想再看第二遍啊...看了看聪神的代码,还消耗我3个NYOJ币啊,,更扯得是,聪神的代码我看不懂啊,,,,卧槽...这道题不再多说了,数据结构上有详细的介绍, ...

最新文章

  1. TDD 与 BDD 仅仅是语言描述上的区别么?
  2. swoole 协程coroutine
  3. boost::utility::string_ref相关的测试程序
  4. 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板
  5. 用生动的案例一步步带你学会python多线程模块
  6. CSAPP Computer System A Programmer Perspective
  7. 涤纶针织物用分散染料染色时,为什么小样与大样不符?
  8. nginx动态php转发,Nginx 动态 upstreams 实现,nginxupstreams_PHP教程
  9. 东芝2000ac废粉盒怎么二次利用_嘉兴秀洲区工业垃圾怎么处理
  10. 大一java题库及答案_2016最新java考试题库及答案
  11. Spring Boot实现的开源ERP系统,学习自用均可
  12. 判断样本均值:单样本T检验,双T检验(T-T检验),配对样本T检验(P-T检验)
  13. 图片扫描纠偏java_Delphi 下 用 ImageEN 进行图像纠偏
  14. 起得比鸡早,睡得比狗晚,干得比驴多,吃得比猪差
  15. 【程序员的爱情】彼岸花开谁又种下了执念
  16. Python教程系列(一)—— Python基础教程之导言
  17. 课堂笔记:逻辑回归和鸢尾花数据集
  18. mysql 1433端口映射_常见路由器的1433端口映射讲解
  19. networkx pagerank
  20. 计算机怎么取消用户锁定,电脑屏显已锁定、切换用户,按照这几个步骤操作,即可关闭它...

热门文章

  1. cacti监控一览无余
  2. 数人云CEO王璞:容器正成为软件交付的标准
  3. unity3d鼠标拖拽模型,旋转模型
  4. Lodash 中文文档 (v3.10.1) - “Lang” 方法
  5. android应用程序的组成部分
  6. fopen参数mode详解
  7. Active Diretory 全攻略(三)--建立域(2)
  8. 希尔排序及C语言实现
  9. 【Python-ML】SKlearn库多项式回归
  10. Windows下Git上传项目代码记录