#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char SElemType ;
typedef struct stack
{
SElemType data;
struct snode *next;
}Snode,*LinkStack;
void initLinkStak(LinkStack *LS)
{
*LS=NULL;
}
int LinkStackEmpty(LinkStack LS)
{
if(LS==NULL) return 1;
else return 0;
}
int LinkStackGetTop(LinkStack LS,SElemType *e)
{
if(LS==NULL) return 0;
*e=LS->data;return 1;
}
int LinkListLength(LinkStack LS)
{
LinkStack p=LS;
int n=0;
while(p){n++;p=p->next;}
return n;
}
void Push(LinkStack *LS,SElemType e)
{
LinkStack p=(LinkStack)malloc(sizeof(Snode));
p->data=e;
p->next=*LS;*LS=p;
}
void Pop(LinkStack *LS,SElemType *e)
{
LinkStack p=*LS;
if(*LS==NULL)return 0;
*e=p->data;
*LS=(*LS)->next;
free(p);
return 1;
}
void Transformaion(char a[],char suff[]);
void main()
{
char data[80],resu[80];
printf("请输入表达式:\n");
gets(data);
Transformaion(data,resu);
puts(resu);
}
int prior(char a)
{
if(a=='*'||a=='/')return 4;
else if(a=='+'||a=='-')return 3;
else if(a=='(')return 2;
else if(a=='#')return 1;
else return 0;
}
void Transformaion(char a[],char suff[])
{
int i=0,k=0,n;char ch;
LinkStack S;
initLinkStak(&S);Push(&S,'#');
n=strlen(a);a[n]='#';a[n+1]='\0';
while(a[i]!='\0')
{
if(a[i]>='0' && a[i]<='9')suff[k++]=a[i];
else
switch(a[i])
{
case '(':Push(&S,a[i]);break;
case ')':
Pop(&S,&ch);
while(ch!='(')
{
suff[k++]=ch;
Pop(&S,&ch);
}
break;
default:
LinkStackGetTop(S,&ch);
if(prior(ch)>=prior(a[i]))
{
suff[k++]=ch;
Pop(&S,&ch);
LinkStackGetTop(S,&ch);
}
if('#'!=a[i])Push(&S,a[i]);
}
i++;
}
suff[k]='\0';
}