#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; }
后缀表达式转换
猜你喜欢
转载自blog.csdn.net/weixin_42348049/article/details/80772154
今日推荐
周排行