中缀转后缀表达式并计算
注:本博客是基于《数据结构》这门课,主要是为了自己考研,准备专业课
图解转自:中缀转后缀算法
中缀转后缀算法
中缀表达式转后缀表达式遵循以下原则:
- 遇到操作数,直接输出
- 当栈为空时,若遇到运算符,则入栈
- 当遇到左括号 “(” 时,则将其入栈
- 当遇到右括号 “)” 时,执行出栈操作,将栈顶的元素输出,直到栈顶元素是左括号时弹出并停止,左括号不输出
- 当遇到其他运算符如“+”、“-”、“ * ” 、“ / ”时,弹出栈中所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈
- 最后,再将栈中的元素依次出栈,输出
- 经过上面的步骤,得到的输出既是转换得到的后缀表达式
⚠️ 运算符优先级: { *,/ } > { +,— } > { ( }
举例: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();}
};
中缀转后缀表达式并计算相关推荐
- 数据结构与算法——中缀转后缀表达式以及计算
中缀表达式转后缀表达式 思路分析: 初始化两个栈:运算符栈s1 和储存中间结果的栈s2 从左至右扫描中缀表达式 遇到操作数,将其压入s2 遇到运算符时,比较其与s1 栈顶运算符的优先级 如果s1 为空 ...
- 顺序栈计算器 中缀转后缀表达式
顺序栈计算器 中缀转后缀表达式 前言 一.后缀表达式简述 二.参考书目中的函数实现 1.输入一个后缀表达式并计算 2.将中缀转后缀表达式 三.在原方法基础上改写并结合两个方法 1.输入一个后缀表达式并 ...
- 前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码
1. 中缀.前缀和后缀表达式 1.1 中缀表达式 首先,中缀表达式的这个"缀"指运算符在两个操作数的位置.中缀表达式其实就是我们常用的算术表达式,比如 2 + 9 - (32 * ...
- 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)
[0]README 0.1) 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤,并给出源代码实现: 0.2) 本文中涉及到的源代码均为原创,是对中缀转后缀和计算后缀的简单实现,(旨在理 ...
- 《数据结构》:中缀表达式转后缀表达式 后缀表达式的计算
目录 一.基本概念 二.中缀表达式转后缀表达式 例 中缀表达式 2*(3+5)+7/1-4 转换为后缀表达式 三.后缀表达式的计算 例 后缀表达式 2 3 5 + * 7 ...
- 阿龙学堂-中缀-后缀表达式的计算
1.简介 在数据结构中,有一种数据结构叫做:Stack,LIFO(Last In First Out),在这个结构中,有个后缀表达式计算,运用该数据结构进行计算. 栈是一种只允许一端操作的线性数据结构 ...
- Java数学表达式计算(中缀转后缀表达式)
文章目录 前言 中缀表达式转后缀表达式 计算后缀表达式 计算形式公式 声明 前言 数学计算的加减乘除人脑算很简单,但是放到计算中却需要进行一些转换,在正式写Java计算数学表达式前,我们需要先来介绍两 ...
- 前缀、中缀、后缀表达式及其相互转化的Java实现
一.中缀表达式转换为前缀.后缀表达式 给个中缀表达式:a+b*c-(d+e) 首先根据运算符的优先级给所有运算单位加括号:((a+(b*c))-(d+e)) 将运算符号移动到对应括号的前面然后去掉所有 ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
最新文章
- Tensorflow-gpu1.13.1 和 Tensorflow-gpu2.0.0共存之安装教程
- java设计模式--观察者模式(Observer)
- Android之自定义checkbox并解决内容和复选框之间的具体问题
- ASP.NET Core 2.1基于SignalR和Vue实时通讯
- c语言定义92bit位变量,Keil C51对C语言的关键词扩展之四: bit
- Linux中的两种守护进程stand alone和xinetd
- 转载JMF多媒体doc教程
- 【Python 每天进步一点点】昨天把接口自动化测试框架部署在 测试环境 Linux 上,并且加入持续集成 Jenkins...
- 5月25 python3.6—pymouse—pyhook_3安装问题
- QQ 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件...
- 抖音快手微视去水印小程序!全网短视频无水印免费下载工具!
- APP测试点总结(表格形式)
- pandas read_csv sep用法
- angular引入ng-zorro中的icon图标方法
- 服务器有无线网卡么,全面认识服务器网卡:理论篇
- python2在线编译器_Skulpt搭建Python在线编译器(二):界面优化
- 制作自动添加IE信任站点运行文件
- 【vue系列-03】vue的计算属性,列表,监视属性及原理
- rewrite常用的.htaccess规则举例(rewrite伪静态规则大全)
- Linux 下创建新用户并且添加为root组用户