魔王语言

  1 /*
  2  * 魔王语言
  3  * 栈----先进后出-----处理带括号的部分
  4  * 队列--先进先出-----将对处理后的语言
  5  * 2018.10.3 fang
  6  */
  7 #include<stdio.h>
  8 #include<stdlib.h>
  9 #define STACK_INIT_SIZE 100;        //存储空间初始分配量
 10 #define STACKINCREMENT 10;          //存储空间分配增量
 11 #define NULL 0;
 12 
 13 /*
 14     输入检验:   1.   B(ehnxgz)B                     输出: tsaedsaeezegexenehetsaedsae
 15                  2.   B(ab(cde)fg)B                   输出: tsaedsaeagafacadacaeacabatsaedsae
 16                  3.   #BooooooMAoo今天天气不错!     输出: #tsaedsaeooooooMsaeoo今天天气不错! 
 17 */
 18 
 19 
 20 typedef struct Sqstack{
 21     char *base;
 22     char *top;
 23     int stacksize;
 24 }sqstack;
 25 
 26 typedef struct QNode{
 27     char data;
 28     struct QNode *next;
 29 }Qnode, *QueuePtr;
 30 
 31 typedef struct LinkQueue{
 32     QueuePtr front;
 33     QueuePtr rear;
 34 }LinkQueue;
 35 //初始化栈
 36 void InitStack(sqstack *s);
 37 //入栈
 38 void push(sqstack *s,char e);
 39 //出栈 
 40 char Pop(sqstack *s);
 41 //初始化队列
 42 void InitQueue(LinkQueue *q);
 43 //入队
 44 void Enqueue(LinkQueue *q,char e);
 45 //出队
 46 char Dequeue(LinkQueue *q);
 47 
 48 
 49 int main() {
 50     sqstack *s;
 51     LinkQueue *q;
 52     int m, j;
 53     int i = 0;
 54     int count = 0; 
 55     char c, language[1000];
 56     q = (LinkQueue*)malloc(sizeof(LinkQueue));
 57     s = (sqstack*)malloc(sizeof(sqstack));
 58     InitStack(s);
 59     InitQueue(q);
 60     //① 首先,将魔王语言存放在language数组中
 61     printf("\t\t*************** Devil's Language ***************\n\n\n");
 62     printf("\t\t请输入魔王语言:\t");
 63     while(c != '\n') {
 64         scanf("%c",&c);
 65         if(c == '(') count++;
 66         language[i] = c;
 67         i++;
 68     }
 69     i--;
 70 
 71 if(count == 0){
 72 } else{
 73         while(count >= 1){
 74             int k1 = 0;
 75         //② 然后,将数组中 第count重括号,(用k1来表示循环到第几重)内元素入栈(括号里的元素放在栈中逆置)
 76         //从第二位数字开始,每位数字后面都插入括号里数据的首字母
 77         
 78         for(j=0;j<=i;j++) {
 79             if(language[j] == '(') {     
 80                 k1++;
 81                 if(k1==count){     
 82                     m = j; // language[m+1]作为固定的首字母值
 83                     push(s,language[m+1]);
 84                     while(language[j+2] != ')'){
 85                         push(s,language[j+2]);
 86                         push(s,language[m+1]);
 87                         j++;
 88                     }
 89                     break;
 90                 }else j++;            
 91             }
 92         }
 93     
 94         //③ 将数组中元素全部入队,遇到存入栈的()先出栈再入队
 95         for(j=0; j<=i; j++) {
 96             if(language[j] == '(' && j==m) { 
 97                     while(s->base != s->top) {
 98                         char e = Pop(s);
 99                         Enqueue(q,e);
100                     }
101                     while(language[j] != ')'){
102                         j++;
103                         continue;
104                        }       
105             }else if(count==1 && (language[j]=='(' || language[j]==')')){
106                 
107             }else Enqueue(q,language[j]);
108         }
109         
110         
111         count--;
112         i = 0;
113         while(q->front != q->rear){
114             language[i] = Dequeue(q);
115             i++;
116         }
117         
118     }
119 }
120 
121     //④ 将队中的元素全部取出,逐个翻译
122     printf("\n\n\t\t翻译之后:\t");
123     for(j = 0; j<=i; j++) {
124         char ch = language[j];
125         if(ch == 'A')                      printf("%s","sae");
126         else if(ch == 'B')               printf("%s","tsaedsae");
127         else                              printf("%c",ch);
128     }
129     return 0;  
130     
131 }
132 
133 
134 
135 
136 
137 
138 
139 
140 
141 
142 
143 //栈操作
144 void InitStack(sqstack *s) {
145     s->base = (char*) malloc(100 * sizeof(char));
146     s->top = s->base;
147     s->stacksize = STACK_INIT_SIZE;
148 }
149 //压栈 
150 void push(sqstack *s,char e) {
151     //如果栈满
152     if(s->top - s->base >= s->stacksize) {
153         s->base = (char *)realloc(s->base,(s->stacksize+10)*sizeof(char));
154         s->stacksize += STACKINCREMENT;
155         s->top = s->base + s->stacksize;
156     }
157     *(s->top) = e;
158     s->top++;
159 }
160 //出栈 
161 char Pop(sqstack *s) {
162     char e;
163     if(s->top-s->base == 0)
164         return -1;
165     --s->top;
166     e = *(s->top);
167     return e;
168 }
169 
170 
171 
172 
173 
174 //队列操作
175 void InitQueue(LinkQueue *q){
176     q->front = q->rear = (QueuePtr)malloc(sizeof(Qnode));
177     if(!q->front) exit(-1);    //内存分配失败 
178     q->front->next = NULL;
179 }
180 //入队 
181 void Enqueue(LinkQueue *q,char e){
182     QueuePtr p = (QueuePtr)malloc(sizeof(Qnode));
183     if(!p) exit(-1);       //内存分配失败 
184     p->data = e;
185     p->next = NULL;
186     q->rear->next = p;
187     q->rear = p;
188 }
189 //出队 
190 char Dequeue(LinkQueue *q){
191     char e;
192     if(q->front == q->rear)    exit(0); 
193     QueuePtr p = q->front->next;
194     e = p->data;
195     q->front->next = p->next;
196     if(q->rear == p)       q->rear = q->front;
197     free(p);
198     return e;
199 }

 

转载请注明地址:https://www.cnblogs.com/fangxiaoqi/

觉得有帮助的话可以点一下推荐,thanks

 

转载于:https://www.cnblogs.com/fangxiaoqi/p/9772401.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[ 问题描述 ] 有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听 懂。但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两 种形式的规则由人的语言逐步抽象上去的: (1) α→β1…βm (2) (θδ1…δn) →θδnθδn-1…θδ1θ 在这两种形式中,从左到右均表示解释;从右到左均表示抽象。试写一个魔 王语言的解释系统,把他的话解释成人能听得懂的话。 [ 基本要求 ] 用下述两条具体规则和上述规则形式(2)实现。 设大写字母表示魔王语言解 释的词汇, 小写字母表示人的语言的词汇;希腊字母表示可以用大写或小写字母 代换的变量。 魔王语言可含人的词汇。 (1).Β→ tΑdΑ (2).Α→ sae [ 测试数据 ] B(einxgz)B 解释成 tsaedsaeezegexeneietsaedsae 若将小写字母与汉字建立下表所示的对应关系, 则魔王说的话是: " 天上一个 《数据结构》题集 14 鹅地上一个鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一个鹅地上一个鹅。" t d s a e z g x n i 天 地 上 一个 鹅 追 赶 下 蛋 恨 [ 实现提示 ] 将魔王语言自右至左进栈,总是处理栈顶。若是开括号,则逐一出栈, 将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入 栈。其他情形较简单,请读者思考应如何处理。应首先实现栈和队列的基本运 算。 [ 选作内容 ] (1).由于问题的特殊性, 可以实现栈和队列的顺序存储空间共享。 (2).在程序开始运行时读入一组第一种形式的规则, 而不是把规则定死在程序 中。 (第二种形式的规则只能定死在程序中)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值