zoukankan      html  css  js  c++  java
  • 续前篇-关于逆波兰表达式的计算

    相对于逆波兰表达式的转换,逆波兰表达的计算可谓简单不少。

    具体计算方法参考:http://www.cnblogs.com/vpoet/p/4659546.html

     

    这里也大致梳理一下:

    1.新建一个栈将逆波兰表达式的数字依次压入栈中

    2.当遇到运算符时,出栈两个数同时将运算结果压栈

    3.重复步骤2直到计算计算,栈中的元素即为逆波兰表达式的计算结果。

     

    实现如下:

      1 #include <iostream>
      2 #include <stack>
      3 using namespace std;
      4 
      5 
      6 int operateprior(char a1)
      7 {
      8     int prior;
      9 
     10     switch(a1)
     11     {
     12     case '(':
     13         prior=0;
     14         break;
     15     case ')':
     16         prior=0;
     17         break;
     18     case '+':
     19         prior=1;
     20         break;
     21     case '-':
     22         prior=1;
     23         break;
     24     case '*':
     25         prior=2;
     26         break;
     27     case '/':
     28         prior=2;
     29         break;
     30     case '%':
     31         prior=2;
     32         break;
     33     }
     34     return prior;
     35 }
     36 
     37 
     38 char* NiBoLanFun(char* Str)
     39 {
     40     stack<char> N;
     41     stack<char> OP;
     42 
     43     while(*Str!='')
     44     {
     45         if(*Str>='0'&&*Str<='9')
     46         {
     47             N.push(*Str);
     48             Str++;
     49         }
     50         else
     51         {
     52             if(*Str=='('||OP.empty())
     53             {
     54                 OP.push(*Str++);
     55             }
     56             else
     57             {
     58                 if(*Str==')')
     59                 {
     60                     while(!OP.empty())
     61                     {
     62                         //cout<<"OP.top="<<OP.top()<<endl;
     63                         if(OP.top()!='(')
     64                         {        
     65                             N.push(OP.top());
     66                         }
     67                         OP.pop();
     68                         if(OP.top()=='(')
     69                         {
     70                             OP.pop();
     71                             break;
     72                         }
     73                     }
     74                     Str++;
     75                 }
     76                 else
     77                 {
     78                     while(!OP.empty()&&operateprior(*Str)<operateprior(OP.top()))
     79                     {
     80                         N.push(OP.top());
     81                         OP.pop();
     82                     }
     83                     OP.push(*Str++);
     84                 }
     85             }
     86         }
     87 
     88     
     89 
     90     }
     91 
     92     while(!OP.empty())
     93     {
     94         N.push(OP.top());
     95         OP.pop();
     96     }
     97 
     98     //cout<<"The Trans string size="<<N.size()<<endl;
     99     char* TransStr;
    100     TransStr=new char[N.size()+1];
    101     memset(TransStr,'',N.size()+1);
    102     int i=N.size()-1;
    103     while(!N.empty())
    104     {
    105         TransStr[i]=N.top();
    106         N.pop();
    107         i--;
    108     }
    109     return TransStr;
    110 }
    111 
    112 int CalcuLateFun(char* Str)
    113 {
    114     int i=0;
    115     stack<int> S;
    116     
    117     while(*Str!='')
    118     {
    119         if(*Str>='0'&&*Str<='9')
    120         {
    121             S.push(*Str-'0');
    122             Str++;
    123         }
    124         else
    125         {
    126             int temp1,temp2;
    127             temp1=S.top();
    128             S.pop();
    129             temp2=S.top();
    130             S.pop();
    131 
    132             if(*Str=='+')
    133             {
    134                 S.push(temp1+temp2);
    135                 Str++;
    136             }
    137             if(*Str=='-')
    138             {
    139                 S.push(temp2-temp1);
    140                 Str++;
    141             }
    142             if(*Str=='*')
    143             {
    144                 S.push(temp1*temp2);
    145                 Str++;
    146             }
    147             if(*Str=='/')
    148             {
    149                 S.push(temp2/temp1);
    150                 Str++;
    151             }
    152             if(*Str=='%')
    153             {
    154                 S.push(temp2%temp1);
    155                 Str++;
    156             }
    157         }
    158     }
    159 
    160     
    161 
    162     return S.top();
    163 }
    164 
    165 void main()
    166 {
    167     char str[50]={''};
    168     char *AfterStr;
    169     cout<<"Please input the operate string: ";
    170     cin>>str;
    171     AfterStr=NiBoLanFun(str);
    172     cout<<"The Trans String is: "<<AfterStr<<endl;
    173     cout<<"The Calculate Answer is: "<<CalcuLateFun(AfterStr)<<endl;
    174     return;
    175 }

    运行截图:

    注意:

    当从栈中弹出两个数据计算的时候应该是考虑两个数的运算顺序当然对于加法乘法运算是没影响的,但

    是对于减法除法以及求余运算应该是按照下面的运算顺序:data2/data1 data2-data1 data2%data1

    中data2为后出栈的数据,data1为先出栈的数据

  • 相关阅读:
    vue中添加favicon.ico
    SEO 小技巧汇总
    vue中echarts随窗体变化
    vue加载Element ui地址省市区插件-- element-china-area-data
    Echarts 修改折线的颜色和折线的点的大小方法
    vue中添加swiper轮播插件
    Cannot find module 'object-keys' 的解决办法
    适用于所有页面的基础样式base.css
    git clone时的各种报错汇总
    css mix-blend-mode 颜色滤镜混合模式
  • 原文地址:https://www.cnblogs.com/vpoet/p/4674940.html
Copyright © 2011-2022 走看看