当我们看到一个四则混合运算的表达式的时候水貔藻疽,我们该如何计算这个表达式的值呢?一般来说,可以采用堆栈的抽象数据结构(stack惺绅寨瞀ADT)来解决。主要分为两个步骤,第一步是要将中缀表达式转化为后缀表达式;其次是计算后缀表达式的值。将中缀表达式转化为后缀表达式的方法,以及在先前的经验中提到过了。在本篇经验中,小编将介绍如何使用堆栈结构计算后缀表达式的值。后缀表达式:一般形式为abop(a,b操作数,op为操作符)。比如1+1就可以携程11+.
工具/原料
code::blocks
c++11编译器
方法/步骤
1、作为例子,我们要计算的后缀表达式为:6523+8∗+3+∗它对应的的中缀表达式为((2+3)*8+5+3)*6
2、创建一个堆栈结构从左到右意思扫描输入的后缀表达式,存储后缀表达式中的操作数。
3、如果扫描到的元素是一个操作数,那么我们就应该把这个操作数存储到堆栈结构当中。
4、如果我们扫描到的元素是一个操作符,那么就从堆栈当中导出(pop)两个操作数,使用该操作符计算两个操作数的值。在将该结果导入到(push)堆栈当中
5、如果如果后缀表达式扫描完毕,那么在堆栈中剩余的那个数就是我们想要的最后结果。
6、在这一步,我将我自己根据该算法写的代码粘贴在下面提供参考。大家也可以根据自己的想法轶葜钥汜自由发挥。#include<iostream>#include<vector&爿讥旌护gt;#include<stack>usingnamespacestd;intmain(){//initializestack<int>st;vector<char>ss={'6','5','2','3','+','8','*','+','3','+','*'};for(autoc:ss){if(c>='0'&&c<='9'){inta1=c-48;st.push(a1);}elseif(c=='*'){inta=st.top();st.pop();intb=st.top();st.pop();st.push(a*b);}elseif(c=='+'){inta=st.top();st.pop();intb=st.top();st.pop();st.push(a+b);}}cout<<st.top()<<endl;return0;}