栈的应用之后缀表达式的求解
来源:互联网 发布:手机玩电音的软件 编辑:程序博客网 时间:2024/06/05 04:38
后缀表达式的求解
在小学的运算中,我们经常接触到的数学表达式,它的规则也就是老生常谈的了-"先乘除,后加减,从左到右,先括号后括号外",但后来出现的四则运算,则要求优先级,计算更加复杂,而计算机解决这种问题的方法就是利用栈,这就引入了后缀表达式
后缀表达式的基本概念:
后缀表达式也叫逆波兰表达式,是一种不需要括号的后缀表达式(RPN),所有的运算符号都在数字的后面.
eg: 12 3 4 + * 6 - 8 2 / +
后缀表达式的求解规则:
(1).从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号就将处于栈顶的两个数字出栈,进行相应的运算,运算结果再次进栈,最终栈顶的元素就是最终的计算结果
(2).当遇到符号将栈顶的两个数字出栈,先出栈的是右操作数,后出栈的为左操作数
就好像拿到武功秘籍一样,那仫具体情况如何呢?请看下图分析:
#pragma once#include<iostream>#include<stack>#include<cassert>#include<cstring>using namespace std;enum Symbol{OP_NUM,OP_SYMBOL,ADD,SUB,SUL,DIV,};struct Cell{char _symbol; //操作符int _value; //操作数};//12 3 4 + * 6 - 8 2 / + = 82//9 3 1 - 3 * + 10 2 / + =20void testMinToLast(){stack<int> s;Cell RPNArray[]={//{OP_NUM,12},//{OP_NUM,3},//{OP_NUM,4},//{OP_SYMBOL,ADD},//{OP_SYMBOL,SUL},//{OP_NUM,6},//{OP_SYMBOL,SUB},//{OP_NUM,8},//{OP_NUM,2},//{OP_SYMBOL,DIV},//{OP_SYMBOL,ADD},{OP_NUM,9},{OP_NUM,3},{OP_NUM,1},{OP_SYMBOL,SUB},{OP_NUM,3},{OP_SYMBOL,SUL},{OP_SYMBOL,ADD},{OP_NUM,10},{OP_NUM,2},{OP_SYMBOL,DIV},{OP_SYMBOL,ADD},};size_t sz=sizeof(RPNArray)/sizeof(RPNArray[0]);for(size_t i=0;i<sz;i++){int right=0,left=0;if(RPNArray[i]._symbol == 0){s.push(RPNArray[i]._value);}else{switch(RPNArray[i]._value){case ADD:right=s.top();s.pop();left=s.top();s.pop();s.push(left+right);break;case SUB:right=s.top();s.pop();left=s.top();s.pop();s.push(left-right);break;case SUL:right=s.top();s.pop();left=s.top();s.pop();s.push(left*right);break;case DIV:right=s.top();s.pop();left=s.top();s.pop();s.push(left/right);break;default:break;}}}cout<<s.top()<<endl;s.pop();}int main(){testMinToLast();system("pause");return 0;}
在知道了后缀表达式的求解之后,中缀表达式如何转为后缀表达式呢?
中缀表达式转后缀表达式的规则:
从左到右遍历中缀表达式的每个数字和符号,若是数字就输出;若是符号,则需要判断该符号与栈顶元素的优先级,如果是右括号或者优先级不高于栈顶符号(乘除优先加减),则栈顶元素依次出栈并输出,并将当前符号进栈,一直到输出最终后缀表达式为止
待续...
0 0
- 栈的应用之后缀表达式的求解
- 栈的应用1;后缀表达式求解
- 栈的应用之求解算术表达式
- 栈的应用之后缀表达式
- 栈的应用实践之中缀表达式转后缀表达式
- 栈的应用之中缀表达式转后缀表达式
- 栈的应用之中缀表达式转换为后缀表达式
- 栈的应用---后缀表达式
- 栈的应用-后缀表达式
- 栈的应用 ---后缀表达式
- 栈的应用之后缀表达式的计算(同时验证是否为合法的后缀表达式)
- 栈的应用之后缀表达式的求值
- 基于栈的应用之计算后缀表达式
- 栈的重要应用之中缀转后缀表达式算法
- 栈的应用实践之计算机执行后缀表达式
- 第六周--数据结构--队列的应用之后缀表达式(栈)
- 栈的应用之中缀表达式转后缀
- (1.2.2.1)栈和队列的应用:数制转换、括号匹配、后缀表达式求解,中缀表达式求解、双栈实现队列,min函数栈
- Hadoop学习笔记——MapReduce
- 第二周项目3-两种排序算法的运行时间
- 高级计算器ASP.NET
- Linux运维笔记----DNS的基本配置
- html5之canvas绘制图形的简单使用
- 栈的应用之后缀表达式的求解
- java多线程之基础分析
- 外部中断使用指南(寄存器设置)
- NMTUI
- SVN服务器搭建和使用(二)
- Frequent values(倍增RMQ)
- 大数据认知(一)之为什么使用Hadoop生态系统处理大数据而不是高性能关系型数据库
- m序列
- SVN服务器搭建和使用(三)