一:需求分析
<1>问题描述
有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1) α 转换为 β1β2…βm
(2) (θδ1δ2…δn) 转换为 θδnθδn-1… θδ1θ
在这两种形式中,从左到右均表示解释。试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
[基本要求]
用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可含人的词汇。
(1)B 转换为 tAdA
(2)A 转换为 sae
[测试数据]
B(exnxgz)B解释成tsaedsaeezegexenehetsaedsae
若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一直鹅地上一只鹅”。
t d s a e z g x n h
天 地 上 一只 鹅 追 赶 下 蛋 恨
二:详细设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <stdio .h>
#define Stack_Size 100
 
typedef struct //定义栈
{
	char elem[Stack_Size];
    int top;
}SeqStack;
 
/*初始化栈*/
void InitStack(SeqStack *s)
{
	s->top=-1;
}
 
/*进栈操作*/
void Push(SeqStack *s,char x)
{
	if(s->top==Stack_Size-1)
		printf("\n\t栈已满!");
    else
	{
		s->top++;s->elem[s->top]=x;
	}
}
 
/*出栈操作*/
void Pop(SeqStack *s,char *x)
{
	if(s->top==-1)
		printf("\n\t栈为空!");
	else
	{
		*x=s->elem[s->top];
		s->top--;
	}
}
 
/*取栈顶元素*/
void GetTop(SeqStack *s,char *x)
{
	if(s->top==-1)
		printf("\n\t栈为空!");
	else
		*x=s->elem[s->top];
}
 
/*判断栈是否为空*/
int IsEmpty(SeqStack *s)
{
	if(s->top==-1)
		return(0);
	else
		return(1);
}
 
/*主函数*/
void main()
{
	SeqStack B,A,s,B1,A1,r,M;//定义栈
	char ch,ch1,ch2,x; //定义需要的字符
	char aa[100];
	int i=0,n;
	InitStack(&B);InitStack(&A);InitStack(&s);InitStack(&r);InitStack(&M);//对定义的栈初始化
 
	printf("\n\t请输入要翻译的魔王语言\n\t");//输入要翻译的魔王语言
	scanf("%s",aa);
	Push(&B,'t');Push(&B,'A');Push(&B,'d');Push(&B,'A');//进栈B→tAdA
	Push(&A,'s');Push(&A,'a');Push(&A,'e');//进栈A→sae
	for(i=0;aa[i]!='\0';i++)//将输入的魔王语言进栈s
		Push(&s,aa[i]);
	while(IsEmpty(&s))
	{
		Pop(&s,&ch);//将栈s的栈顶提取出来赋值给ch
		if(ch=='B')
		{
			B1=B;//将栈B赋值给栈B1
 
			while(IsEmpty(&B1))
			{
				Pop(&B1,&ch1);//B1不为空栈,则将栈B1的栈顶提取出来赋值给ch1
				if(ch1=='A')
				{
					A1=A;//将栈A赋值给栈A1
					while(IsEmpty(&A1))
					{
						Pop(&A1,&ch2);//将栈A1的栈顶提取出来赋值给ch2
						Push(&r,ch2);//ch2进栈r
					}
				}
				else Push(&r,ch1);//ch1不等于A的话,ch1进栈r
			}
		}
		else if(ch=='A')
		{
			A1=A;//ch=A的话,将栈A赋值给栈A1
			while(IsEmpty(&A1))
			{
				Pop(&A1,&ch2);//将栈A1的栈顶提取出来赋值给ch2
				Push(&r,ch2);//ch2进栈r
			}
		}
		else if(ch==')')
		{
			Pop(&s,&ch2);//ch=(,将栈s的栈顶提取出来赋值给ch2
			while(ch2!='(')
			{
				Push(&M,ch2);//ch2进栈M
				Pop(&s,&ch2);//将栈s的栈顶提取出来赋值给ch2
			}
			GetTop(&M,&ch2);//将栈M的栈顶提取出来赋值给ch2
			x=ch2;
			Pop(&M,&ch2);//将栈M的栈顶提取出来赋值给ch2
			while(IsEmpty(&M))
			{
				Push(&r,x);
				Pop(&M,&ch2);
				Push(&r,ch2);
			}
			Push(&r,x);
		}
		else Push(&r,ch);
	}
	M=r;
	printf("\n\n\t翻译的结果为:");//输出翻译的结果
	while(IsEmpty(&M))
	{
		Pop(&M,&ch);
		printf("%c",ch);
	}
	printf("\n\n\t是否继续翻译为汉语:(1-继续,0-不继续)\n\t");  //将魔王语言进一步转变成中文
	scanf("%d",&n);
	if(n==1)
	{
		printf("\n\n\t翻译为汉语的结果为:\n\n\t");
		M=r;
		while(IsEmpty(&M))
		{
			Pop(&M,&ch);
			if(ch=='t')      printf("天");
			else if(ch=='d') printf("地");
			else if(ch=='s') printf("上");
			else if(ch=='a') printf("一只");
			else if(ch=='e') printf("鹅");
			else if(ch=='z') printf("追");
			else if(ch=='g') printf("赶");
			else if(ch=='x') printf("下");
			else if(ch=='n') printf("蛋");
			else if(ch=='h') printf("恨");
		}
		printf("\n");
	}
	else ;
}
</stdio>

>> 若为原创,转载请注明: 转载自Laycher's Blog

>> 本文链接地址: 数据结构之 魔王语言

>> 订阅本站: http://feed.feedsky.com/laycher



无觅相关文章插件,快速提升流量