码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-25 00:03:28      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

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

具体计算方法参考: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!=\0)
 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,\0,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!=\0)
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]={\0};
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为先出栈的数据

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

标签:

原文地址:http://www.cnblogs.com/vpoet/p/4674940.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!