zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    多IDC数据分布--MySQL多机房部署
    Mongodb~连接串的整理
    Jenkins~配合Docker及dotnetCore进行生产和测试环境的灵活部署
    jenkins~集群分发功能的具体实现
    DotNetCore跨平台~linux上还原自主nuget包需要注意的问题
    jenkins~集群分发功能和职责处理
    HDU 2074 叠筐
    破解Veeam过程
    hdu1015(Safecracker )
    Oracle—RMAN备份(一)
  • 原文地址:https://www.cnblogs.com/shihuajie/p/2619289.html
Copyright © 2011-2022 走看看