[问题描述]
有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1) α -> β1β2„βm
(2)(θδ1δ2„δn)->θδnθδn-1„ θδ1θ
在这两种形式中,从左到右均表示解释。试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。 [基本要求]
用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可含人的词汇。
(1)B -> tAdA (2)A -> sae [测试数据]
B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae
若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。 t /d /s /a / e / z /g / x/ n / h/—》 天/ 地 /上 /一只 /鹅 /追 /赶 /下/ 蛋/ 恨 /
1 #include<stdio.h> 2 3 int main(){ 4 char stack[1000],temp,dec; 5 int i = 0,d = 0,j; 6 7 printf("请输入魔王语言:"); 8 9 while((temp = getchar()) != ‘#‘){ 10 if(temp <= ‘z‘ && temp >= ‘a‘){ 11 stack[i] = temp; 12 i++; 13 } 14 if(temp == ‘A‘){ 15 stack[i] = ‘s‘;stack[i+1] = ‘a‘;stack[i+2] = ‘e‘; 16 i = i + 3; 17 } 18 if(temp == ‘B‘){ 19 stack[i] = ‘t‘;stack[i+1] = ‘s‘;stack[i+2] = ‘a‘;stack[i+3] = ‘e‘;stack[i+4] = ‘d‘;stack[i+5] = ‘s‘;stack[i+6] = ‘a‘;stack[i+7] = ‘e‘; 20 i = i + 8; 21 } 22 if(temp == ‘(‘){ 23 while((temp = getchar()) != ‘)‘){ 24 stack[i] = temp; 25 i++;d++;//d为计数器 26 }//将括号里的魔王语言压栈 27 char temp_1[d]; 28 for(j = 0;j < d;j++){ 29 temp_1[j] = stack[i-1]; 30 i--; 31 }//括号里的魔王语言出栈 32 dec = stack[i-1];//寻找 xita 33 //将翻译后的魔王语言压栈 34 for(j = 0;j < d;j++){ 35 stack[i] = dec; 36 stack[i+1] = temp_1[j]; 37 i = i + 2; 38 } 39 //i = i + 2; 40 stack[i] = dec;//让i到应该到的位置 41 i++; 42 } 43 } 44 for(j = 0;j < i;j++){ 45 if(stack[j] == ‘t‘)printf("天"); 46 if(stack[j] == ‘d‘)printf("地"); 47 if(stack[j] == ‘s‘)printf("上"); 48 if(stack[j] == ‘a‘)printf("一只"); 49 if(stack[j] == ‘e‘)printf("鹅"); 50 if(stack[j] == ‘z‘)printf("追"); 51 if(stack[j] == ‘g‘)printf("赶"); 52 if(stack[j] == ‘x‘)printf("下"); 53 if(stack[j] == ‘n‘)printf("蛋"); 54 if(stack[j] == ‘h‘)printf("恨"); 55 } 56 57 return 0; 58 }
关键就是魔王语言的括号翻译那比较繁琐。
还有就是网上输入的B(ehnxgz)B在这个程序里会出现:天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅鹅鹅天上一只鹅地上一只鹅
这是因为在这行魔王语言中,θ为e,恰好本段魔王语言中的括号里也有e(事实上我应该将多余的θ删去的,但是偷懒了^_-)。
原文:http://www.cnblogs.com/djzdcw/p/4020015.html