魔王语言解释-数据结构课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实习2、魔王语言解释
一、需求分析
1. 问题描述
有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的懂,但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1)α->β1 β2 ... βn
(2)(θδ1 δ2 ... δn) —>θδn θδn-1 ...θδ1 θ
在这两种形式中,从左到右均表示解释。试写一个魔王解释系统,把他的话解释成人能听懂得话。
2. 基本要求
用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写或小写字母代换的变量。魔王语言可含人的词汇。
(1)B—>tAdA
(2)A—>sae
3. 测试数据
B(ehnxgz)B 解释成tsaedsaeezegexenehetsaedsae
若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一个鹅地上一个鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一个鹅地上一个鹅”。
4. 实现提示
将魔王的语言自右至左进栈,总是处理栈顶字符。若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。其他情形较简单,请读者思考如何处理。应首先实现栈和队列的基本操作。
二、概要设计
1、设定栈的抽象数据类型定义:
ADT Stack {
数据对象:D= {a i| a i∈CharSet, i= 1,2,……n,. n≥0 }
数据关系:R1={ | a i-1,a i∈D, a i-1 基本操作: InitStack(*S) 操作结果:构造一个空栈。 Push(*S,e) 初始条件:栈S已存在 操作结果:在栈顶插入新的元素。 Pop(*S,*e) 初始条件:栈S已存在 操作结果:删除栈顶元素,并用e返回其值。 StackEmpty(S) 初始条件:栈S已存在 操作结果:若S为空栈,则返回1,否则返回0。 ClearStack(*S) 初始条件:栈S已存在 操作结果:将栈S清空。 InStack(char* ch,SqStack *s) 初始条件:栈S已存在 操作结果:把字符数组从右至左压入栈中。 }ADT Stack ADT Queue{ 数据对象:D={ai | ai∈CharSet i= 1,2,……n,. n≥0 } 数据关系:R1={< ai-1,ai > |ai-1,ai∈D t i= 1,2,……n} 基本操作: InitQueue (*Q) 操作结果:构造一个空队列Q。 EnQueue(*Q,e) 初始条件:队列Q已经存在。 操作结果:插入元素e为Q的新的队尾元素。 DeQueue(*Q,*e) 初始条件:队列Q已经存在。 操作结果:删除Q的对头元素,并以e返回其值。 QueueEmpty(Q) 初始条件:队列Q已经存在。 操作结果:若队列Q为空栈,则返回1,否则返回0。 }ADT Queue 三、详细设计(源代码) (使用C语言) #include #include #define STACK_INIT_SIZE 100//存储空间初始分配量 #define STACKINCREMENT 10//存储空间分配增量 typedef struct { char* base;//栈底指针 char* top;//栈顶指针 int stacksize; }SqStack; typedef struct QNote { char data; struct QNote *next; }QNote,*QueuePtr; typedef struct { QueuePtr front;//队头指针 QueuePtr rear;//队尾指针 }LinkQueue; void InitStack(SqStack *s) {//构造一个空栈 s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char)); s->top=s->base; s->stacksize=STACK_INIT_SIZE; } void Push(SqStack *s,char e) {//插入元素e为新的栈顶元素 if(s->top-s->base>=STACK_INIT_SIZE) { s->base=(char*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(char)); s->top=s->base+s->stacksize; s->stacksize+=STACKINCREMENT; } *(s->top)=e; s->top++; } void Pop(SqStack *s,char *e) {//元素e出栈 *e=*--s->top; } int StackEmpty(SqStack s) {//判断栈是否为空 if(s.top==s.base) return 1; else return 0; }