• 续前篇-关于逆波兰表达式的计算


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

    具体计算方法参考: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 项目结构介绍
    使用命令行创建 Vue 项目
    GitHub无法访问怎么办?-- 已解决
    Spa 单页面应用简介
    JetBrains WebStorm 常用快捷键总结
    使用 WebStorm + Vue 写一个九九乘法表
    使用 WebStorm 2018 运行第一个 Vue 程序
    小工具
    elasticsearch安装部署
    命令行连接ftp
  • 原文地址:https://www.cnblogs.com/vpoet/p/4674940.html
Copyright © 2020-2023  润新知