相对于逆波兰表达式的转换,逆波兰表达的计算可谓简单不少。
具体计算方法参考:http://www.cnblogs.com/vpoet/p/4659546.html
这里也大致梳理一下:
1.新建一个栈将逆波兰表达式的数字依次压入栈中
2.当遇到运算符时,出栈两个数同时将运算结果压栈
3.重复步骤2直到计算计算,栈中的元素即为逆波兰表达式的计算结果。
实现如下:
1 #include2 #include 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 N; 41 stack 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="< < >str;171 AfterStr=NiBoLanFun(str);172 cout<<"The Trans String is: "< <
运行截图:
注意:
当从栈中弹出两个数据计算的时候应该是考虑两个数的运算顺序当然对于加法乘法运算是没影响的,但
是对于减法除法以及求余运算应该是按照下面的运算顺序:data2/data1 data2-data1 data2%data1其
中data2为后出栈的数据,data1为先出栈的数据