中缀表达式转后缀表达式
中缀表达式a + b*c + (d * e + f) * g,其转换成后缀表达式则为a b c * + d e * f + g * +。
转换过程需要用到栈,具体过程如下:
1)如果遇到操作数,我们就直接将其输出。
2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。
3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。
4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。当然按照优先级数组来说也是很正常的。
5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
#include
#include
#include
using namespace std;
bool Decide(char c);
char Precede(char a,char b);
char SwitchPrecede(stack &tempS,char &c);
int main()
{
cout<<"the end of your input should be '#'"<<endl;
stack tempS;//临时存放操作符
char c;
int temp = 0;
c = getchar();
tempS.push('#');
while(true)
{
if(temp!=0)
{
cout<<temp;
temp=0;
}
if(Decide(c))
{
if(c==')')
{
while(tempS.top()!='(')
{
cout<<tempS.top();
tempS.pop();
}
tempS.pop();//去除左括号
c=getchar();
continue;
}
if(tempS.top()=='#')
{
tempS.push(c);
}
else if(c!='#')
{
SwitchPrecede(tempS,c);
}
}
else if(c>='0'&&c<='9')
{
temp = temp*10+c-'0';
}
if(c=='#')
{
while(tempS.top()!='#')
{
cout<<tempS.top();
tempS.pop();
}
break;
}
c = getchar();
}
return 0;
}
bool Decide(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return true;
else
return false;
}
char Precede(char a,char b)
{
int j[2];
char table[7][7]=
{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','e'},
{'>','>','>','>','e','>','>'},
{'<','<','<','<','<','e','='}
};
for(int i=0;i<2;i++)
{
char c;
if(i==0)
{
c=a;
}
else if(i==1)
{
c=b;
}
switch(c)
{
case '+':j[i]=0;break;
case '-':j[i]=1;break;
case '*':j[i]=2;break;
case '/':j[i]=3;break;
case '(':j[i]=4;break;
case ')':j[i]=5;break;
case '#':j[i]=6;break;
}
}
return table[j[0]][j[1]];
}
char SwitchPrecede(stack &tempS,char &c)
{
switch(Precede(tempS.top(),c))
{
case '>':
case '=':
cout<<tempS.top();
tempS.pop();
SwitchPrecede(tempS,c);//递归
break;
case '<':
tempS.push(c);
break;
}
}