#include <stdio.h>
#define maxnum 40
typedef struct
{
char stack[maxnum];
int top;
}qstype;
int pushqs(qstype S,char x) // 入栈
{
if(S->top>=maxnum-1)
return (0);
else
{
S->top++;
S->stack[S->top]=x;
return (1);
}
}
char popqs(qstype *S) //出栈
{
if(S->top<0)
return (0);
else
{
S->top--;
return (S->stack[S->top+1]);
}
}
char gettopqs (qstype S) //取栈顶元素
{
if(S.top<0)
return (0);
else
return(S.stack[S.top]);
}
int postfix(qstype *S,char a[]) //变中缀表达式为后缀表达式
{
char x1,x2,x;
int j=0;
char proceed();
S->stack[0]='#';
S->top=0;
x2=a[j];
x1=gettopqs(*S);
for(;;)
{
if(x2!='+' && x2!='-'&& x2!='*'&& x2!='/'&& x2!='('&& x2!=')'&& x2!='#')
{
printf("%c",x2); //输出操作符
j++;
x2=a[j]; //取下一个单词
}
else
if(proceed(x1,x2)=='<') //栈顶操作符x1小于读到的操作符x2
{
pushqs(S,x2); //将读到的操作符入栈
x1=gettopqs(*S); //更新x1的值为新入栈的操作符
j++;
x2=a[j]; //取下一个单词
}
else
if(proceed(x1,x2)=='>')
{
x=popqs(S); //退栈
printf("%c",x); //输出原栈顶操作符
}x1=gettopqs(*S); //更新x1的值
else if(proceed(x1,x2)=='='&& x1=='('&& x2==')') //去掉括号
{
popqs(S);
x1=gettopqs(*S);
j++;
x2=a[j];
}
else if(proceed(x1,x2)=='=' && x1=='#' && x2=='#')
return; //处理完毕
}
}
char proceed(char x1,char x2) //比较各个运算符的优先级
{
if(x1=='+'|| x1=='-')
x1='+';
if(x1=='*'|| x1=='/')
x1='*';
switch(x1)
{
case'+':
if(x2=='+' || x2=='-' || x2==')' || x2=='#')
return ('>');
return ('<');
case'*':
if(x2=='(')
return ('>');
return ('<');
case'(':
if(x2==')')
return ('=');
return ('<');
case')':
return('>');
case'#':
if(x2=='#')
return ('=');
return ('<');
default:
exit(0);
}
}
main()
{
qstype *s ;
int i=0;
char ch,a[maxnum];
int postfix();
printf(">");
while((ch=getchar())!=' ') //以'#'或' '结束
a[i++]=ch;
postfix(s,a);
printf("\n");
}