魔王语言解释-数据结构课程设计_第1页
魔王语言解释-数据结构课程设计_第2页
魔王语言解释-数据结构课程设计_第3页
魔王语言解释-数据结构课程设计_第4页
魔王语言解释-数据结构课程设计_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实习2、魔王语言解释一、需求分析.问题描述有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的情,但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:a->P1P2...Pn(06162...6n)一>96n06n-l...0610在这两种形式中,从左到右均表示解释。试写•个魔王解释系统,把他的话解释成人能听懂得话。.基本要求用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写或小写字母代换的变量。魔王语言可含人的词汇。B—>tAdAA—>sae.测试数据B(ehnxgz)B解释成Isaedsaeezegexenehelsaedsae若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一个鹅地上一个鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一个鹅地上一个鹅”。tdSaeZgXnh天地上-只鹅追赶下蛋恨.实现提示将魔王的语言自右至左进栈,总是处理栈顶字符。若是开括号,则逐一出栈,将字母顿序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。其他情形较简单,请读者思考如何处理。应首先实现栈和队列的基本操作。二、概要设计1、设定栈的抽象数据类型定义:ADTStack{数据对象:D={a|aCharSet,i=1,2,n,.n20}数据关系:Rl={<a,a>|a,aGD,a<a,i=l,2,n}i-1ii-lii-li基本操作:InilStack(*S)操作结果:构造一个空栈。Push(*S,e)初始条件:栈S已存在操作结果:在栈顶插入新的元素。Pop(*S,*e)初始条件:栈S已存在操作结果:删除栈顶元素,并用e返回其值。StackEmpty(S)初始条件:栈S已存在操作结果:若S为空栈,则返回I,否则返回0。ClcarStack(*S)初始条件:栈S已存在操作结果:将栈S清空。InStack(char*ch,SqStack*s)初始条件:栈S已存在操作结果:把字符数组从右至左压入栈中。}ADTStackADTQueue{数据对象:D={ai|aiCharSeti=1,2,n,.n20}数据关系:Rl={<ai-l,ai>|ai-l,ai^Dti=1,2,n}基本操作:InitQueue(*Q)操作结果:构造一个空队列Q。EnQueue(*Q,e)初始条件:队列Q已经存在。操作结果:插入元素e为Q的新的队尾元素。DeQueue(*Q,*e)初始条件:队列Q已经存在。操作结果:删除Q的对头元素,并以e返何其值。QueueEmpty(Q)初始条件:队列Q已经存在。操作结果:若队列Q为空栈,则返网1,否则返回0。}ADTQueue三、详细设计(源代码)(使用C语言)#include<stdio.h>#include<stdlib.h>#defineSTACK_INIT_SIZE100〃存储空间初始分配量#defineSTACKINCREMENT10〃存储空间分配增量typedefstruct(char*base;〃栈底指针char*top;〃栈顶指针intstacksize;}SqStack;typedefstructQNotechardata;structQNote*next;jQNote/QueuePtr;typedefstruct(QueuePtrfront;〃队头指针QueuePtrrear;〃队尾指针}LinkQueue;voidlnitStack(SqStack*s){〃构造一个空栈s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));s->top=s->base;s->stacksize=STACK_INIT_SIZE;)voidPush(SqStack*s,chare){〃插入元素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++;)voidPopfSqStack*s,char*e){〃元素e出栈*e=*-s->top;)intStackEmptyfSqStacks){〃判断栈是否为空if(s.top==s.base)return1;elsereturn0;voidClearStack(SqStack*s){〃清空栈s->top=s->base;)voidInitQueuefLinkQueue*q){〃构造一个空队列q->front=q->rear=(QNote*)malloc(sizeof(QNote));q->front->next=NULL;)voidEnQueue(LinkQueue*q,chare){〃插入元素e为新的队尾元素QNote*P;p=(QNote*)malloc(sizeof(QNote));p->data=e;p->next=NULL;q->rear->next=p;q->rear=p;)voidDeQueue(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);)intQueueEmpty(LinkQueueq){〃判断队列是否为空if(q.front==q.rear)return1;elsereturn0;}voidlnStack(char*chzSqStack*s){〃把字符数组从右至左压入栈中inti,L=0;while(ch[L]!='\O')

L++;for(i=L-l;i>=0;i-)Push(s,ch[i]);)intmain()printf(M**************************************************************printf("*****************************printffprintf(printf(II*“**魔王语言解释系统*****************************II**************************************************************,\n");*\n");*\n");*\n");\n");intxunhuan=l;printf("请输入您想要解释的魔王语言:\n");while(xunhuan==l)while(xunhuan==l)while(xunhuan==l)〃一个总循环控制整个程序的重登进行charA[]="sae";charB[]="tsaedsae";charflag='O';charel,key,e2,e,i=0;intmark=l;intf=l;charMoWang[100]="\0";〃大写字母作为字符数组名存放小写字母while(xunhuan==l)〃一个总循环控制整个程序的重登进行charA[]="sae";charB[]="tsaedsae";charflag='O';charel,key,e2,e,i=0;intmark=l;intf=l;charMoWang[100]="\0";〃大写字母作为字符数组名存放小写字母//flag用来标记处理括号〃标记输入的魔王语言是否在允许的范围之内//判断括号是否匹配〃定义一个魔王变量,存放待解释的语言字符SqStackS;SqStacktemp;lnitStack(&S);lnitStack(&temp);LinkQueueQ;lnitQueue(&Q);gets(MoWang);lnStack(MoWang,&S);while(SStackEmpty(S))〃作为栈存储元素,为后续操作和输出做准备〃用来处理括号外的元素〃变量MoWang存储输入的语言〃把要解释的魔王语言压入栈中〃把魔王语言进行出栈,不符合语言的进行提示Pop(&S,&el);if(el=='(')(if(StackEmpty(S)){printf("魔王语言错误!\n”);mark=0;f=0;break;)while(!StackEmpty(S))Pop(&S,&el);if(el==')'){if(i==O)〃判断是否存在空括号(本程序设空括号为非法语言)f=0;break;)elseif(!(el>='a,&&el<='z,)&&!(el>=,A,&&el<=,Z')){printf("魔王语言错误!\n");mark=O;break;if(mark==O)break;if(f!=l)printf("魔王语言错误!\n");break;printf("魔王语言错误!\n");mark=O;break;elseif(!(el>='a'&&el<=,z')&&!(el>='A,&&el<=,Z'))printf("魔王语言错误!\n");mark=O;break;if(mark==l&&f==l)if(mark==l&&f==l)if(mark==l&&f==l)〃对符合语言规则的魔王语言进行规则处理ClearStack(&S);if(mark==l&&f==l)〃对符合语言规则的魔王语言进行规则处理ClearStack(&S);lnStack(MoWang,&S);while(!StackEmpty(S))ClearStack(&S);lnStack(MoWang,&S);while(!StackEmpty(S))ClearStack(&S);lnStack(MoWang,&S);while(!StackEmpty(S))〃把魔王语言从右至左压栈存放〃栈不空时,用栈temp进行存储不带括号内元素的元素的元素Pop(&S,&el);

if(el=='B'||el=='A')Push(&temp,el);elseif(el=='(')〃用队存储括号中的元素的元素Pop(&S,&el);(Push(&temp,flag);〃有括号的话就用flag标记Pop(&S,&el);while(el!=')')〃把括号中的元素存入队列中(EnQueue(&Cbel);Pop(&S,&el);)if(!QueueEmpty(Q))DeQueue(&Q,&key);//将队头的元素赋值给key)elsePush(&temp,el);)while(!StackEmpty(temp))〃将魔王说的语言规则地压入栈s中{

Pop(&temp,&el);

if(el!=flag)

Push(&S,el);〃把括号外的元素压入栈s中elsewhile(!QueueEmpty(Q))〃处理括号中的元素进栈

{

DeQueue(&Ct&e2);

Push(&S,key);

Push(&S,e2);

)

Push(&S,key);〃最后还要压•个key

)

)

printf("解释后的语言为:\n");

while(!StackEmpty(S))〃依次出栈输出处理后的元素{Pop(&S,&e);EnQUeue(&(Xe);〃元素进队是为了输出对应汉字〃翻译成对应的汉字if(e=='B')printf("%s"zB);elseif(e==,A')printf("%s",A);elseprintf("%c"ze);)printf("\n");while(!QueueEmpty(Q))DeQueue(&Q,&e);〃翻译成对应的汉字switch(e){case'f:printf("^");break;case'd':printf("地");break;case's':printf("±");break;case'a':printf("一只");break;case'e':printf("鹅");break;case*z':printf("追");break;case'g':printf(“赶");break;case'x':printf("下");break;case*n':printf("蛋”);break;case'h':printf("恨");break;caseB:printf(“天上一只鹅地上一只鹅”);break;case'A':printf("上一只鹅,break;default:printf("(对不起此处为非法字符或词汇!)");break;))printf("\n");)printf("再次输入魔王语言(按数字键0退出)\n”);scanf("%d",&xunhuan);)return0;)四、调试分析编译环境为CodeBlockSo魔干语言解释系统请输入您想要解释的魔王语言:B<ehnxgz>B解释后的语言为,tcaodGaeoNegoxc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论