栈的应用之后缀表达式的求解

来源:互联网 发布:手机玩电音的软件 编辑:程序博客网 时间: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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机qq密码忘了怎么办 腾讯安全中心冻结解冻进不去怎么办 qq钱包充值限额怎么办 qq没绑卡支付密码忘了怎么办 手机qq停止运行该怎么办 手机不支持qq软件运行怎么办 王者传奇冲元宝不到账怎么办 支付宝充值地下城点卷冲错了怎么办 dnf点券冲错了怎么办 百家号改了手机绑定找不到了怎么办 银行卡换了网银怎么办 qq没有银行卡转不出钱怎么办 qq钱包限制一万怎么办 qq余额超过20万怎么办 扣扣忘记了密码怎么办 qq钱包发不出来怎么办 qq支付密码忘了怎么办? 扣扣上转账错了怎么办 qq绑卡存在异常怎么办 微信没绑银行卡忘记支付密码怎么办 微信的自动扣费怎么办 不小心把钱充到微信财付通该怎么办 财付通用什么充值卡充值话费怎么办 苹果手机灯坏了怎么办 手机电灯不亮了怎么办? 苹果手机相机坏了怎么办 苹果5s手机背光灯不亮怎么办 苹果5s灯控坏了怎么办 微信q币冲错号码怎么办 支付宝转账到之前号码怎么办 qq红包收不了钱怎么办 qq抢红包要实名认证怎么办 支付宝被骗冲q币怎么办 qq发红包发错了怎么办 qq红包发不出来怎么办 qq红包发多了怎么办 qq发红包要短信验证怎么办 不是qq好友发了红包怎么办 苹果手机升级后支付宝打不开怎么办 qqq币充了没进帐怎么办 怎么办q币换成qq余额