#include <stdio.h>
#define Maxsize 20
typedef struct SNode{
char Data[Maxsize];
int Top;
}*Stack;
int compare(char a,char b)
{
int Nothigher=0;
if(!((a=='*'||a=='/')&&(b=='+'||b=='-'||b=='(')||((a=='+'||a=='-')&&b=='(')))
Nothigher=1;
return Nothigher;
}
void Push(char X,Stack S)
{
S->Data[++(S->Top)]=X;
}
void Pop(Stack S)
{
if(S->Data[S->Top]=='(')
S->Top--;
else
printf(" %c",S->Data[(S->Top)--]);
}
int main()
{
Stack S=(Stack)malloc(sizeof(struct SNode));
S->Data[Maxsize]=(char)malloc(Maxsize*sizeof(char));
char str[Maxsize]="";
int i;
for(i=0;(str[i]=getchar())!='\n';i++);
i--;
int j;
int flag1=0,flag2=0,flag3=0;
//flag1 判断是否是连续的数字,连续数字直接无需空格;
//flag2 判断是否是第一次输出,第一次输出前无空格;
//flag3 判断减号是否是负号,依据是其前一位不是数字和右括号
S->Top = -1;//初始化
for(j=0;j<=i;j++)
{
if((str[j]>='0'&&str[j]<='9')||str[j]=='.')//属于数字部分,直接输出
{
if(flag1==0&&flag2!=0)//上一字符不为数字&&不是首次输出
printf(" ");
printf("%c",str[j]);
flag1=1;//此字符为数字
flag2=1;//已输出,不再是首次输出
flag3=1;//此字符为数字
}
else if(str[j]=='(')
{
flag1=0;//此字符非数字
Push(str[j],S);
flag3=0;//此字符非数字非右括号
}
else if(str[j]==')')
{
flag1=0;//此字符非数字
while(S->Data[S->Top]!='(')
{
Pop(S);
}
Pop(S);
flag3=1;//此字符为右括号
}
else
{
if(str[j]=='-'&&flag3==0)//判断"-"号是否为负号
{
if(flag2!=0)//非首字符
printf(" ");
printf("%c",str[j]);
flag1=1;//此字符为负号,属于数字部分
continue;
}
if(S->Top!=-1)
{
while(compare(str[j],S->Data[S->Top])&&S->Top>=0)
{
Pop(S);
}
}
Push(str[j],S);
flag1=0;//此字符非数字
flag3=0;//此字符非数字非右括号
}
}
while(S->Top>=0)
{
Pop(S);
}
return 0;
}#include <stdio.h>
#define Maxsize 20
t