中缀表达式转换为后缀表达式
给出一个中缀表达式,请将其转换为后缀表达式并输出。
输入 1 + 2 + ( 1 * 2 )
输出 1 2 + 1 2 * +
直接上代码
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct status* Status;
struct status
{
ElemType Data;
struct status* Next;
};
Status Creatstatus()
{
Status headnode=(Status)malloc(sizeof(struct status));
headnode->Next=NULL;
return headnode;
}
Status Push(Status D,char X)
{
Status newnode=(Status)malloc(sizeof(struct status));
newnode->Data=X;
newnode->Next=D->Next;
D->Next=newnode;
}
Status Pop(Status D)
{
if(D->Next==NULL)
{
return -1;
}
Status p=D->Next;
char X;
X=p->Data;
D->Next=p->Next;
free(p);
return X;
}
Status Top(Status D)
{
if(D->Next==NULL)
{
return -1;
}
return D->Next->Data;
}
int Isempty(Status D)
{
if(D->Next==NULL)
{
return -1;
}
return 0;
}
int main()
{
char expressions[1001];
gets(expressions);
Status D=Creatstatus();
int i=0;
char X;
int idx=0;
for(i=0;expressions[i]!=0;i++)
{
if(expressions[i]==' ')
{
continue;
}
if((expressions[i]>='0')&&(expressions[i]<='9'))
{
if(idx!=0)
printf(" ");
while((expressions[i]>='0')&&(expressions[i]<='9'))
{
printf("%c",expressions[i]);
i++;
}
i--;
idx++;
}
else
{
X=expressions[i];
if(Isempty(D)==-1)
{
Push(D,X);
}
else
{
if(expressions[i]=='(')
Push(D,X);
else if(expressions[i]==')')
{
while(Top(D)!='(')
{
printf(" %c",Top(D));
Pop(D);
}
Pop(D);
}
else if((expressions[i]=='-')||(expressions[i]=='+'))
{
while(D->Next!=NULL)
{
if(Top(D)!='(')
{
printf(" %c",Top(D));
Pop(D);
}
else
break;
}
Push(D,expressions[i]);
}
else if((X=='*')||(X=='/'))
{
if((Top(D)=='*')||(Top(D)=='/'))
{
printf(" %c",Top(D));
Pop(D);
Push(D,X);
}
else
{
Push(D,expressions[i]);
}
}
}
}
}
while(Isempty(D)==0)
{
Status p=D->Next;
printf(" %c",p->Data);
Pop(D);
}
return 0;
}