表达式计算的中序转后序
计算表达式 (A*B+(C+D))-(E*F*H)
这种表达式如果是人来做,非常容易,但对于程序来说,有些困难,但如果转换成后序表达式AB*CD++EFH**-,那么程序就舒服多了
转换的过程并不难,我们使用一个栈,将要转换的表达式中的字符逐个检查,如果字符不是运算符,即是字母,那么我们就讲这个字符放入到新的表达式中,如果是运算符,那么我们只要遵循以下原则即可
1.如果要放入的运算符的运算级别低于栈顶的运算符,那么就将栈顶的运算符弹出,放入到新的表达式,重复这个动作直到栈顶的运算符运算优先级低于或等同于我们要放入栈中的运算符的优先级
2.如果是左括号,不做操作,如果是又括号,那么就将栈中的栈顶弹出放入到新的表达式,重复这个动作,直到将左括号弹出,但是括号不要放入到新的表达式中
3.其他情况下,直接入栈
4.逐个检查结束后,将栈中剩余的运算符弹出,放入到新的表达式中
下面是程序
1 bool midToEnd(const char*expStr,char *newExpStr) 2 { 3 if(expStr==NULL||newExpStr==NULL) 4 return false; 5 6 stack<char> my; 7 for(int i=0;i<strlen(expStr);i++) 8 { 9 char t=*(expStr+i); 10 switch(t) 11 { 12 case '+': 13 while(!my.empty()&&(my.top()=='*'||my.top()=='/')) 14 { 15 *(newExpStr++)=my.top(); 16 my.pop(); 17 } 18 my.push(t); 19 break; 20 case '-': 21 while(!my.empty()&&(my.top()=='*'||my.top()=='/')) 22 { 23 *(newExpStr++)=my.top(); 24 my.pop(); 25 } 26 my.push(t); 27 break; 28 case '*': 29 my.push(t); 30 break; 31 case '/': 32 my.push(t); 33 break; 34 case '(': 35 my.push(t); 36 break; 37 case ')': 38 while(my.top()!='(') 39 { 40 *(newExpStr++)=my.top(); 41 my.pop(); 42 } 43 my.pop(); 44 break; 45 default: 46 *(newExpStr++)=t; 47 break; 48 } 49 } 50 while(!my.empty()) 51 { 52 *(newExpStr++)=my.top(); 53 my.pop(); 54 } 55 *(newExpStr++)='\0'; 56 return true; 57 }