• nyoj257 郁闷的C小加(一)


      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 }
  • 相关阅读:
    truncate table
    SSIS学习笔记
    Bing Developer Assistant开发随记
    数组中的逆序对
    第一个只出现一次的字符
    丑数
    把数组排成最小的数
    连续子数组的最大和
    最小的k个数
    数组中出现次数超过一半的数字
  • 原文地址:https://www.cnblogs.com/shihuajie/p/2619285.html
Copyright © 2020-2023  润新知