严题集3-21中缀表达式转换为逆波兰(后缀)表达式
char Procede(char a,char b)
{
char priority[7][7]=
{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','0'},
{'>','>','>','>','0','>','>'},
{'<','<','<','<','<','0','='}
};
int i,j;
switch(a)
{
case'+':i=0;break;
case'-':i=1;break;
case'*':i=2;break;
case'/':i=3;break;
case'(':i=4;break;
case')':i=5;break;
case'#':i=6;break;
}
switch(b)
{
case'+':j=0;break;
case'-':j=1;break;
case'*':j=2;break;
case'/':j=3;break;
case'(':j=4;break;
case')':j=5;break;
case'#':j=6;break;
}
return priority[i][j];
}
Status Reverse_Polish_Notation(char *input,char *output)
{
int length=strlen(input);
if(length==0) return ERROR;
SqStack S;
char e;
InitStack(S);
Push(S,'#');
int count=0;
for(int i=0;i<length;i++)
{
while((input[i]>='0'&&input[i]<='9')||(input[i]>='a'&&input[i]<='z')||(input[i]>='A'&&input[i]<='Z')&&i<length)
output[count++]=input[i++];
GetTop(S,e);
if(i>=length)
break;
switch(Procede(e,input[i]))
{
case '<': Push(S,input[i]);break;
case '=': Pop(S,e);break;
case '>': Pop(S,output[count++]);i--;break;
case '0': return ERROR;
}
}
if(! Is_Stack_Empty(S)) Pop(S,output[count++]);
printf("%s\n",output);
return OK;
}