nyoj467 中缀式变后缀式

  1 #include<stdio.h>

  2 #include<stdlib.h>

  3 #define N 1010

  4 //字符栈的操作

  5 typedef struct

  6 {

  7   char *base;

  8   char *top;

  9 }SqStack;

 10 int InitStack(SqStack &S)

 11 {

 12   S.base=(char *)malloc(N*sizeof(char));

 13   if(!S.base)  exit(1);

 14   S.top=S.base;

 15   return 1;

 16 }

 17 int StackEmpty(SqStack &S)

 18 {

 19   if(S.top==S.base)

 20   return 1;

 21   return 0;

 22 }

 23 int GetTop(SqStack S,char &e)

 24 {

 25     if(S.top==S.base)  return 0;

 26     e=*(S.top-1);

 27     return 1;

 28 }

 29 int Push(SqStack &S,char e)

 30 {

 31   *S.top++=e;

 32   return 1;

 33 }

 34 int Pop(SqStack &S,char &e)

 35 {

 36   if(S.top==S.base)  return 0;

 37   e=*--S.top;

 38   return 1;

 39 }

 40 //转化的操作过程

 41 static int i;

 42 int Pass(char *s,char c)

 43 {

 44     s[i]=c;

 45     i++;

 46     return 1;

 47 }

 48 int level(char c,int k)

 49 {

 50     switch(c)

 51     {

 52         case '=': return 1;

 53         case ')': return k?2:5;

 54         case '+':

 55         case '-': return 3;

 56         case '*':

 57         case '/': return 4;

 58         case '(': return k?5:2;

 59         default : return 0;

 60     }

 61 }

 62 int Precede(char c1,char c2)

 63 {

 64     int k=(c1=='('&&c2=='=')||(c1=='='&&c2==')')||(c1==')'&&c2=='(');

 65     if(!k)

 66     {

 67         if(level(c1,0)<level(c2,1)||c1=='='&&c2=='=') return 0;

 68         return 1;

 69     }

 70     return 0;

 71 }

 72 int Converse(char *s)

 73 {

 74     SqStack OPTR;

 75     char ch,x,c=getchar();

 76     InitStack(OPTR); Push(OPTR,'=');

 77     while(!StackEmpty(OPTR))

 78     {

 79         if(!level(c,1))

 80             Pass(s,c);

 81         else

 82         switch(c)

 83         {

 84             case '(': Push(OPTR,c);break;

 85             case ')': Pop(OPTR,ch);while(ch!='('){Pass(s,ch);Pop(OPTR,ch);}break;

 86             default :

 87                       while(GetTop(OPTR,ch)&&Precede(ch,c))

 88                       {

 89                           Pass(s,ch);Pop(OPTR,ch);

 90                       }

 91                       if(c!='=')

 92                       Push(OPTR,c);

 93                       break;

 94         }

 95         if(c!='=')

 96         {

 97             x=c;c=getchar();

 98             if(!level(x,1)&&level(c,1))

 99             Pass(s,' ');

100         }

101         else

102             Pop(OPTR,ch);

103     }

104     s[i]='\0';

105     return 1;

106 }

107 //主函数

108 int main()

109 {

110     char s[1010];

111     int j,n;

112     scanf("%d",&n);

113     while(n--){

114         getchar();

115         i=0;

116         Converse(s);

117         for(j=0;s[j];++j){

118             putchar(s[j]);

119             if(level(s[j],0)) putchar(' ');

120         }

121         printf("=\n");  

122     }

123     //system("pause");

124     return 0;

125 }

 

你可能感兴趣的:(OJ)