注意:本文主要讲解中缀转后缀的转换方法,因此本来的数字用小写字母来表示。
式子的表示形式;
一般表达式(前缀表达式)比如 : a+b*c+(d+e)*f
后缀表达式 : abc*+de+f*+
为什么要转换成为后缀表达式?
后缀式虽然我们看起来极其的麻烦,但是对于计算机来说可以非常高效地运算,计算机处理后缀表达式值时,遇见要处理的数字便压入栈,若遇到运算符时取出栈顶的两个元素,进行运算,得到的结果,再放入栈中,运算完成后栈中存的元素就是最终运算的结果。
怎么样转换以及转换的具体代码:
一、对于给出的中缀表达式从头到尾进行遍历
1.遇到字母直接输出。
2.遇到 )直接输出栈中的操作符直到( 为止,结束后再将 ( 也抛出栈。
3.若遇到运算符,只要栈顶的符号的优先级不低于当前的运算符,就不断取出栈顶中的元素输出出来,最后再将新符号进栈。(如果遇到 ’( ‘ 直接入栈)。
二、遍历完成后,依次将栈中的元素输出出来,直到栈为空为止。
读者可以通过代码来进一步理解:
1 #include<iostream> 2 #include<stack> 3 using namespace std; 4 5 stack<char>sta; 6 string s; 7 char ans[100]; 8 int cmp(char a,char b){ 9 if(b=='(' || a=='(')return 0; 10 else if((b=='*'||b=='/'||b=='%')&&(a=='+'||a=='-'))return 0; 11 else return 1; 12 } 13 int main(){ 14 int p=0; 15 cin>>s; 16 int len =s.size(); 17 for(int i=0;i<len ; i++){ 18 if(s[i]>='a'&&s[i]<='z')ans[p++]=s[i]; 19 else if(s[i]==')'){ 20 while(sta.top()!='('){ 21 char c = sta.top(); 22 sta.pop(); 23 ans[p++] = c; 24 } 25 sta.pop(); 26 } 27 else { 28 while(!sta.empty() && cmp(sta.top(),s[i])){ // 栈顶元素的优先级大于等于当前元素的优先级 29 char c =sta.top(); 30 sta.pop(); 31 ans[p++] = c; 32 } 33 sta.push(s[i]); 34 } 35 } 36 while(sta.size()){ 37 char c =sta.top(); 38 ans[p++] = c; 39 sta.pop(); 40 } 41 ans[p]=' '; 42 cout<<ans<<endl; 43 return 0; 44 }