题目描述
输入
输出
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxsize 10000
#define sizenum 10000
typedef char element;
typedef struct
{
element *base;
element *top;
int stsize;
} sq;
int intistack(sq*l)
{
l->base=(element*)malloc(maxsize*sizeof(element));
if(!l->base)
return-1;
l->top=l->base;
l->stsize=maxsize;
return 0;
}
int panduan(char *a)
{
if(*a=='('||*a==')')
return 4;
if(*a=='*'||*a=='/')
return 3;
if(*a=='+'||*a=='-')
return 2;
return 0;
}
int empty(sq*l)
{
if(l->base==l->top)
return 1;
else return 0;
}
int push(sq*l,char *a)
{
if(l->top-l->base>l->stsize)
{
l->base=(element*)realloc(l->base,(l->stsize+sizenum)*sizeof(element));
if(!l->base)
return -1;
l->top=l->base+l->stsize;
l->stsize+=sizenum;
}
*(++l->top)=*a;
return 0;
}
int chuli(sq*l,char s[])
{
int len=strlen(s),i;
for(i=0; i<=len-1; i++)
{
if(s[i]=='#')
break;
if('a'<=s[i]&&s[i]<='z')//不是运算符直接输出
printf("%c",s[i]);
else if(empty(l))//栈空直接压入栈
push(l,&s[i]);
else if(!empty(l))//栈非空
{
if(s[i]==')')//若为右括号
{
while(*(l->top)!='(')
{
printf("%c",*(l->top));
l->top--;
}
l->top--;
continue;
}
else if(panduan(&s[i])>panduan(l->top))//不是右括号则判断优先级
{
push(l,&s[i]);
}
else if(panduan(&s[i])<=panduan(l->top))//优先级小的分两种情况
{
if(*(l->top)!='(')//直到栈顶优先级比他小为止
{
while(!empty(l)&&panduan(&s[i])<panduan(l->top)&&*(l->top)!='(')//注意条件判定
{
printf("%c",*(l->top--));
}
push(l,&s[i]);
}
else//栈顶为左括号直接入栈
{
push(l,&s[i]);
}
}
}
}
while(l->top!=l->base)
printf("%c",*(l->top--));
return 0;
}
int main()
{
element s[maxsize];
sq l;
scanf("%s",s);
intistack(&l);
chuli(&l,s);
return 0;
}