注:本博客是基于《数据结构》这门课,主要是为了自己考研,准备专业课
图解转自:中缀转后缀算法

中缀转后缀算法

中缀表达式转后缀表达式遵循以下原则:

  1. 遇到操作数,直接输出
  2. 当栈为空时,若遇到运算符,则入栈
  3. 当遇到左括号 “(” 时,则将其入栈
  4. 当遇到右括号 “)” 时,执行出栈操作,将栈顶的元素输出,直到栈顶元素是左括号时弹出并停止,左括号不输出
  5. 当遇到其他运算符如“+”、“-”、“ * ” 、“ / ”时,弹出栈中所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈
  6. 最后,再将栈中的元素依次出栈,输出
  7. 经过上面的步骤,得到的输出既是转换得到的后缀表达式

⚠️ 运算符优先级: { *,/ } > { +,— } > { ( }

举例:a+b * c+(d * e+f) * g ——> abc * +de * f+g * +

图示上述过程:

遇到a,直接输出:


遇到+,此时栈为空,入栈:


遇到b,直接输出:


遇到*,此时其优先级大于栈顶符号+的优先级,则入栈:
遇到c,输出:

遇到+,目前站内的* 、+优先级都大于或等于它,因此将栈内的* 、+依次弹出并且输出,并且将这个+入栈:

遇到(,将其入栈:


遇到d,直接输出:

遇到*,由于其优先级高于处在栈顶的(,因此直接入栈:

遇到e,直接输出:


遇到+,此时栈顶的*优先级高于+,但是栈内的( 优先级低于 +,故将 * 出栈输出,+入栈:


遇到f,直接输出:


遇到 ),弹出栈顶元素并且输出,直到遇到( 才结束,在这里也就是弹出+输出,弹出(不输出:


遇到*,优先级高于栈顶+,将*入栈

遇到g,直接输出:


此时中缀表达式已全部处理完成,故依次将栈中元素出栈并输出,直到栈为空:


代码部分:

//中缀表达式转后缀表达式
#include<iostream>
#include<string>
#include<stack>using namespace std;int prio(char op) {                 //给运算符优先级排序int priority=0;if (op == '*' || op == '/')priority = 2;if (op == '+' || op == '-')priority = 1;if (op == '(')priority = 0;return priority;
}bool Trans(string& str1, string& str2) {   //引用传递stack<char> s;                   //定义一个char类型的栈sint i;for (i = 0; i < str1.size(); i++) {if (str1[i] >= '0' && str1[i] <= '9') {    //如果是数字,直接入栈str2 += str1[i];}else        //否则不是数字{                       if (s.empty())            //栈空则入站s.push(str1[i]);else if (str1[i] == '(')   //左括号入栈s.push(str1[i]);else if (str1[i] == ')') {  //如果是右括号,只要栈顶不是左括号,就弹出并输出while (s.top() != '(') {str2 += s.top();s.pop();}s.pop();                 //弹出左括号,但不输出}else {     //当栈顶非空时while (prio(str1[i]) <= prio(s.top())) { //当栈顶优先级大于等于当前运算符,输出str2 += s.top();s.pop();if (s.empty())      //栈为空,停止break;}s.push(str1[i]);   //把当前运算符入栈}}}while (!s.empty()) {      //最后,如果栈不空,则弹出所有元素并输出str2 += s.top();s.pop();}return true;
}int main() {                //主程序string infix; //保存输入的中缀表达式string postfix;     cout << "请输入中缀表达式:" << infix << endl;cin >> infix;Trans(infix, postfix);cout << "后缀表达式为:" << postfix << endl;system("pause");return 0;
}

后缀表达式计算思路:

从左往右依次扫描后缀表达式,遇到操作数入栈,遇到运算符、则弹出两个操作数、计算结果并将结果入栈( 注:先弹出的为右操作数,后弹出的为左操作数),循环以上过程,直到扫描完后缀表达式,此时栈中的数即为运算结果。
图解:

实例:

输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
输出: 22
解释:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

具体实现:

class Solution {public:int evalRPN(vector<string>& tokens) {stack<int> numbers;for(int i = 0 ; i < tokens.size() ;i++){//若为运算符,则弹出两个栈顶元素,进行运算并将结果放回栈if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/"){int res;int n2 = numbers.top();numbers.pop();int n1 = numbers.top();numbers.pop();if(tokens[i] == "+")res = n1 + n2;else if(tokens[i] == "-")res = n1 - n2;else if(tokens[i] == "/")res = n1 / n2;elseres = n1 * n2;numbers.push(res);}else{//若为运算数,则直接入栈numbers.push(tokens[i]);} }return numbers.top();}
};

中缀转后缀表达式并计算相关推荐

  1. 数据结构与算法——中缀转后缀表达式以及计算

    中缀表达式转后缀表达式 思路分析: 初始化两个栈:运算符栈s1 和储存中间结果的栈s2 从左至右扫描中缀表达式 遇到操作数,将其压入s2 遇到运算符时,比较其与s1 栈顶运算符的优先级 如果s1 为空 ...

  2. 顺序栈计算器 中缀转后缀表达式

    顺序栈计算器 中缀转后缀表达式 前言 一.后缀表达式简述 二.参考书目中的函数实现 1.输入一个后缀表达式并计算 2.将中缀转后缀表达式 三.在原方法基础上改写并结合两个方法 1.输入一个后缀表达式并 ...

  3. 前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码

    1. 中缀.前缀和后缀表达式 1.1 中缀表达式 首先,中缀表达式的这个"缀"指运算符在两个操作数的位置.中缀表达式其实就是我们常用的算术表达式,比如 2 + 9 - (32 * ...

  4. 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)

    [0]README 0.1) 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤,并给出源代码实现: 0.2) 本文中涉及到的源代码均为原创,是对中缀转后缀和计算后缀的简单实现,(旨在理 ...

  5. 《数据结构》:中缀表达式转后缀表达式 后缀表达式的计算

    目录 一.基本概念 二.中缀表达式转后缀表达式 例       中缀表达式  2*(3+5)+7/1-4  转换为后缀表达式 三.后缀表达式的计算 例       后缀表达式  2 3 5 + * 7 ...

  6. 阿龙学堂-中缀-后缀表达式的计算

    1.简介 在数据结构中,有一种数据结构叫做:Stack,LIFO(Last In First Out),在这个结构中,有个后缀表达式计算,运用该数据结构进行计算. 栈是一种只允许一端操作的线性数据结构 ...

  7. Java数学表达式计算(中缀转后缀表达式)

    文章目录 前言 中缀表达式转后缀表达式 计算后缀表达式 计算形式公式 声明 前言 数学计算的加减乘除人脑算很简单,但是放到计算中却需要进行一些转换,在正式写Java计算数学表达式前,我们需要先来介绍两 ...

  8. 前缀、中缀、后缀表达式及其相互转化的Java实现

    一.中缀表达式转换为前缀.后缀表达式 给个中缀表达式:a+b*c-(d+e) 首先根据运算符的优先级给所有运算单位加括号:((a+(b*c))-(d+e)) 将运算符号移动到对应括号的前面然后去掉所有 ...

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

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

最新文章

  1. Tensorflow-gpu1.13.1 和 Tensorflow-gpu2.0.0共存之安装教程
  2. java设计模式--观察者模式(Observer)
  3. Android之自定义checkbox并解决内容和复选框之间的具体问题
  4. ASP.NET Core 2.1基于SignalR和Vue实时通讯
  5. c语言定义92bit位变量,Keil C51对C语言的关键词扩展之四: bit
  6. Linux中的两种守护进程stand alone和xinetd
  7. 转载JMF多媒体doc教程
  8. 【Python 每天进步一点点】昨天把接口自动化测试框架部署在 测试环境 Linux 上,并且加入持续集成 Jenkins...
  9. 5月25 python3.6—pymouse—pyhook_3安装问题
  10. QQ 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件...
  11. 抖音快手微视去水印小程序!全网短视频无水印免费下载工具!
  12. APP测试点总结(表格形式)
  13. pandas read_csv sep用法
  14. angular引入ng-zorro中的icon图标方法
  15. 服务器有无线网卡么,全面认识服务器网卡:理论篇
  16. python2在线编译器_Skulpt搭建Python在线编译器(二):界面优化
  17. 制作自动添加IE信任站点运行文件
  18. 【vue系列-03】vue的计算属性,列表,监视属性及原理
  19. rewrite常用的.htaccess规则举例(rewrite伪静态规则大全)
  20. Linux 下创建新用户并且添加为root组用户

热门文章

  1. Python实现的一个简洁轻快的后台管理框架.支持拥有多用户组的RBAC管理后台,不用配置各种运行环境
  2. 【ATF】庄卓然(南天):掌上精彩-连接过去与未来
  3. c# propertyGrid下拉选项
  4. 【webapp】开发手机版WEBAPP MOBILE APP
  5. 哪个邮箱好用又安全?最安全的邮箱排名是?
  6. 详谈QTableWidget / QTableView
  7. 云服务器性能测试的方法
  8. tcpdump、nc
  9. python 查看处理器架构
  10. 【Python】司徒卢威函数