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为先出栈的数据

  • 相关阅读:
    记一次Redis+Getshell经验分享
    冰蝎动态二进制加密WebShell基于流量侧检测方案
    ubuntu16下安装mongodb 3.6
    centos安装sass环境必看
    CLR 调试体系结构
    CLR 调试概述
    CLR Exception---E0434352
    关于System.MissingMethodException异常
    关于异常System.ArgumentException
    从.NET/CLR返回的hresult:0x8013XXXX的解释
  • 原文地址:https://www.cnblogs.com/vpoet/p/4674940.html
Copyright © 2011-2022 走看看