相对于逆波兰表达式的转换,逆波兰表达的计算可谓简单不少。
具体计算方法参考: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为先出栈的数据
时间: 2024-10-27 03:51:42