版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实习2、魔王语言解释一、 需求分析1. 问题描述有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的懂,但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐 步抽象上去的:(1)->1 2 . n(2)( 1 2 . n) > n n-1 . 1 在这两种形式中,从左到右均表示解释。试写一个魔王解释系统,把他的话解释成人能听懂得话。2. 基本要求 用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写或小写字母代换的变量。魔王语言可含人的词汇。
2、 (1)B>tAdA (2)A>sae 3. 测试数据B(ehnxgz)B 解释成tsaedsaeezegexenehetsaedsae若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一个鹅地上一个鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一个鹅地上一个鹅”。 tdsaezgxnh天地上一 只鹅追赶下蛋恨4. 实现提示 将魔王的语言自右至左进栈,总是处理栈顶字符。若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。其他情形较简单,请读者思考如何处理。应首先实现栈和队列的基本操作。二、 概要设计1、 设定栈的抽象数据
3、类型定义:ADT Stack 数据对象:D= ai| aiCharSet, i= 1,2,n,. n0 数据关系:R1= <ai-1 ,ai> | ai-1,aiD, ai-1<ai ,i=1,2,n 基本操作: InitStack(*S) 操作结果:构造一个空栈。 Push(*S,e) 初始条件:栈S已存在 操作结果:在栈顶插入新的元素。 Pop(*S,*e) 初始条件:栈S已存在 操作结果:删除栈顶元素,并用e返回其值。 StackEmpty(S) 初始条件:栈S已存在 操作结果:若S为空栈,则返回1,否则返回0。ClearStack(*S) 初始条件:栈S已存在 操作结
4、果:将栈S清空。InStack(char* ch,SqStack *s) 初始条件:栈S已存在 操作结果:把字符数组从右至左压入栈中。ADT StackADT Queue数据对象:D=ai | aiCharSet i= 1,2,n,. n0 数据关系:R1=< ai-1,ai > |ai-1,aiD t i= 1,2,n 基本操作:InitQueue (*Q) 操作结果:构造一个空队列Q。EnQueue(*Q,e)初始条件:队列Q已经存在。操作结果:插入元素e为Q的新的队尾元素。DeQueue(*Q,*e)初始条件:队列Q已经存在。操作结果:删除Q的对头元素,并以e返回其值。Que
5、ueEmpty(Q)初始条件:队列Q已经存在。操作结果:若队列Q为空栈,则返回1,否则返回0。ADT Queue三、 详细设计(源代码)(使用C语言)#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 100/存储空间初始分配量#define STACKINCREMENT 10/存储空间分配增量typedef struct char* base;/栈底指针 char* top;/栈顶指针 int stacksize;SqStack;typedef struct QNote char data; struc
6、t 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->b
7、ase>=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=
8、s.base) return 1; else return 0;void ClearStack(SqStack *s)/清空栈 s->top=s->base;void InitQueue(LinkQueue *q)/构造一个空队列 q->front=q->rear=(QNote*)malloc(sizeof(QNote); q->front->next=NULL;void EnQueue(LinkQueue *q,char e)/插入元素e为新的队尾元素 QNote *p; p=(QNote*)malloc(sizeof(QNote); p->data
9、=e; p->next=NULL; q->rear->next=p; q->rear=p;void DeQueue(LinkQueue *q,char *e)/元素出队 QNote *p; p=q->front->next; *e=p->data; q->front->next=p->next; if(q->rear=p) q->rear=q->front; free(p);int QueueEmpty(LinkQueue q)/判断队列是否为空 if(q.front=q.rear) return 1; else r
10、eturn 0;void InStack(char* ch,SqStack *s)/把字符数组从右至左压入栈中 int i,L=0; while(chL!='0') L+; for(i=L-1;i>=0;i-) Push(s,chi);int main() printf("*n"); printf("* * *n"); printf("* * 魔王语言解释系统 * *n"); printf("* * *n"); printf("*n"); int xunhuan=1; pr
11、intf("请输入您想要解释的魔王语言:n"); while (xunhuan=1) /一个总循环控制整个程序的重复进行 char A="sae" /大写字母作为字符数组名存放小写字母 char B="tsaedsae" char flag='0' /flag用来标记处理括号 char e1,key,e2,e,i=0; int mark=1; /标记输入的魔王语言是否在允许的范围之内 int f=1; / 判断括号是否匹配 char MoWang100="0" /定义一个魔王变量,存放待解释的语言字
12、符 SqStack S; /作为栈存储元素,为后续操作和输出做准备 SqStack temp; /用来处理括号外的元素 InitStack(&S); InitStack(&temp); LinkQueue Q; InitQueue(&Q); gets(MoWang); /变量MoWang存储输入的语言 InStack(MoWang,&S); /把要解释的魔王语言压入栈中 while(!StackEmpty(S) /把魔王语言进行出栈,不符合语言的进行提示 Pop(&S,&e1); if(e1='(') if(StackEmpty(
13、S) printf("魔王语言错误!n"); mark=0;f=0; break; while(!StackEmpty(S) Pop(&S,&e1); if(e1=')') if(i=0)/判断是否存在空括号(本程序设空括号为非法语言) f=0; break; else if(!(e1>='a'&&e1<='z')&&!(e1>='A'&&e1<='Z') printf("魔王语言错误!n"
14、;); mark=0; break;i+; if(mark=0) break; if(f!=1) printf("魔王语言错误!n"); break; else if(e1=')') printf("魔王语言错误!n"); mark=0; break; else if(!(e1>='a'&&e1<='z')&&!(e1>='A'&&e1<='Z') printf("魔王语言错误!n")
15、; mark=0; break; if(mark=1&&f=1) /对符合语言规则的魔王语言进行规则处理 ClearStack(&S); InStack(MoWang,&S); /把魔王语言从右至左压栈存放 while(!StackEmpty(S) /栈不空时,用栈temp进行存储不带括号内元素的元素 Pop(&S,&e1); if(e1='B'|e1='A') Push(&temp,e1); else if(e1='(') /用队存储括号中的元素 Push(&temp,flag);
16、 /有括号的话就用flag标记 Pop(&S,&e1); while(e1!=')') /把括号中的元素存入队列中 EnQueue(&Q,e1); Pop(&S,&e1); if(!QueueEmpty(Q) DeQueue(&Q,&key); /将队头的元素赋值给key else Push(&temp,e1); while(!StackEmpty(temp) /将魔王说的语言规则地压入栈s中 Pop(&temp,&e1); if(e1!=flag) Push(&S,e1); /把括号外的元
17、素压入栈s中 else while(!QueueEmpty(Q) /处理括号中的元素进栈 DeQueue(&Q,&e2); Push(&S,key); Push(&S,e2); Push(&S,key); /最后还要压一个key printf("解释后的语言为:n"); while(!StackEmpty(S) /依次出栈输出处理后的元素 Pop(&S,&e); EnQueue(&Q,e); /元素进队是为了输出对应汉字 if(e='B') printf("%s",B); e
18、lse if(e='A') printf("%s",A); else printf("%c",e); printf("n"); while(!QueueEmpty(Q) /翻译成对应的汉字 DeQueue(&Q,&e); switch(e) case 't' : printf("天");break; case 'd' : printf("地"); break; case 's' : printf("上"); break; case 'a' : printf("
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 585-2026船用法兰铸钢截止止回阀
- T/ZMDS 30004-2023口腔正畸活动矫治器
- T/JQR 13-2023高等教育 互动智慧教室 使用管理规范
- T/CNCA 156-2025煤矿用掘锚一体机再制造技术规范
- T/CAWAORG 058-2026基于长寿医学的老年健康服务规范
- T/CSPIA 002-2020手机音视频紧急求助与报警系统技术要求
- GB/T 223.3-2026钢铁及合金磷含量的测定分光光度法、滴定法和重量法
- 2025~2026学年广东省深圳市龙岗区北师大版六年级上册12月阶段性试卷【附答案】
- AI赋能电子元器件生产全流程质量管控
- 钻杆热处理调质操作工规程
- Unit4 A better me Speed up教学课件2026-2027外研版五上英语
- 《对比之魅》教学课件-2026-2027学年人美版(新教材)小学美术四年级上册
- 我国食品安全存在的问题及对策
- 2026语文新教材 六年级上册第3课 古诗词三首 教学课件
- 2026年上海农林职业技术学院高职单招笔试职业适应性测验试题库含答案解析3套试卷
- 2026年动物防疫专员试题(附答案)
- 河南农商行审计考试试题及答案
- 2026年福建省厦门市辅警(协警)招聘考试题库及答案
- 新能源重卡充电站项目可行性研究报告
- 2026年公路水运工程试验检测师《道路工程》考试题库及答案
- 2025年南宁市社区工作者招聘考试《综合能力》真题及答案
评论
0/150
提交评论