NYOJ 257 郁闷的C小加(一)

同中缀式转化到后缀式

地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=257

  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 '\n': 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     if(level(c1,0)<level(c2,1)||c1=='\n'&&c2=='\n') return 0;

 65     return 1;

 66 }

 67 int Converse(char *s)

 68 {

 69     SqStack OPTR;

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

 71     InitStack(OPTR); Push(OPTR,'\n');

 72     while(!StackEmpty(OPTR))

 73     {

 74         if(!level(c,1))

 75             Pass(s,c);

 76         else

 77         switch(c)

 78         {

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

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

 81             default :

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

 83                       {

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

 85                       }

 86                       if(c!='\n')

 87                       Push(OPTR,c);

 88                       break;

 89         }

 90         if(c!='\n')

 91         {

 92             x=c;

 93    c=getchar();

 94         }

 95         else

 96         {

 97             Pop(OPTR,ch);

 98             Pass(s,ch);

 99   }

100     }

101     s[i]='\0';

102     return 1;

103 }

104 //主函数

105 int main()

106 {

107     char s[1010];

108     int j,n;

109     scanf("%d%*c",&n);

110  while(n--){

111   

112   i=0;

113      Converse(s);

114      for(j=0;s[j];++j)

115    putchar(s[j]);

116  }

117     return 0;

118 }

你可能感兴趣的:(OJ)