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 }

 

转载于:https://www.cnblogs.com/shihuajie/archive/2012/08/02/2619285.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值