续前篇-关于逆波兰表达式的计算
相对于逆波兰表达式的转换,逆波兰表达的计算可谓简单不少。
具体计算方法参考: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为先出栈的数据
作者:vpoet
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。