魔王语言解释-数据结构课程设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实习2、魔王语言解释一、需求分析1.问题描述有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的懂,但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α-β1β2...βn(2)(θδ1δ2...δn)—θδnθδn-1...θδ1θ在这两种形式中,从左到右均表示解释。试写一个魔王解释系统,把他的话解释成人能听懂得话。2.基本要求用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写或小写字母代换的变量。魔王语言可含人的词汇。(1)B—tAdA(2)A—sae3.测试数据B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一个鹅地上一个鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一个鹅地上一个鹅”。tdsaezgxnh天地上一只鹅追赶下蛋恨4.实现提示将魔王的语言自右至左进栈,总是处理栈顶字符。若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。其他情形较简单,请读者思考如何处理。应首先实现栈和队列的基本操作。二、概要设计1、设定栈的抽象数据类型定义:ADTStack{数据对象:D={ai|ai∈CharSet,i=1,2,……n,.n≥0}数据关系:R1={ai-1,ai|ai-1,ai∈D,ai-1ai,i=1,2……,n}基本操作: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已存在操作结果:把字符数组从右至左压入栈中。}ADTStackADTQueue{数据对象:D={ai|ai∈CharSeti=1,2,……n,.n≥0}数据关系:R1={ai-1,ai|ai-1,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语言)#includestdio.h#includestdlib.h#defineSTACK_INIT_SIZE100//存储空间初始分配量#defineSTACKINCREMENT10//存储空间分配增量typedefstruct{char*base;//栈底指针char*top;//栈顶指针intstacksize;}SqStack;typedefstructQNote{chardata;structQNote*next;}QNote,*QueuePtr;typedefstruct{QueuePtrfront;//队头指针QueuePtrrear;//队尾指针}LinkQueue;voidInitStack(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++;}voidPop(SqStack*s,char*e){//元素e出栈*e=*--s-top;}intStackEmpty(SqStacks){//判断栈是否为空if(s.top==s.base)return1;elsereturn0;}voidClearStack(SqStack*s){//清空栈s-top=s-base;}voidInitQueue(LinkQueue*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;}voidInStack(char*ch,SqStack*s){//把字符数组从右至左压入栈中inti,L=0;while(ch[L]!='\0')L++;for(i=L-1;i=0;i--)Push(s,ch[i]);}intmain(){printf(**************************************************************\n);printf(******************************\n);printf(**魔王语言解释系统**\n);printf(******************************\n);printf(**************************************************************\n);intxunhuan=1;printf(请输入您想要解释的魔王语言:\n);while(xunhuan==1)//一个总循环控制整个程序的重复进行{charA[]=sae;//大写字母作为字符数组名存放小写字母charB[]=tsaedsae;charflag='0';//flag用来标记处理括号chare1,key,e2,e,i=0;intmark=1;//标记输入的魔王语言是否在允许的范围之内intf=1;//判断括号是否匹配charMoWang[100]=\0;//定义一个魔王变量,存放待解释的语言字符SqStackS;//作为栈存储元素,为后续操作和输出做准备SqStacktemp;//用来处理括号外的元素InitStack(&S);InitStack(&temp);LinkQueueQ;InitQueue(&Q);gets(MoWang);//变量MoWang存储输入的语言InStack(MoWang,&S);//把要解释的魔王语言压入栈中while(!StackEmpty(S))//把魔王语言进行出栈,不符合语言的进行提示{Pop(&S,&e1);if(e1=='('){if(StackEmpty(S)){printf(魔王语言错误!\n);mark=0;f=0;break;}while(!StackEmpty(S)){Pop(&S,&e1);if(e1==')'){if(i==0)//判断是否存在空括号(本程序设空括号为非法语言)f=0;break;}elseif(!(e1='a'&&e1='z')&&!(e1='A'&&e1='Z')){printf(魔王语言错误!\n);mark=0;break;}i++;}if(mark==0)break;if(f!=1){printf(魔王语言错误!\n);break;}}elseif(e1==')'){printf(魔王语言错误!\n);mark=0;break;}elseif(!(e1='a'&&e1='z')&&!(e1='A'&&e1='Z')){printf(魔王语言错误!\n);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);elseif(e1=='(')//用队存储括号中的元素{Push(&temp,flag);//有括号的话就用flag标记Pop(&S,&e1);while(e1!=')')//把括号中的元素存入队列中{EnQueue(&Q,e1);Pop(&S,&e1);}if(!QueueEmpty(Q))DeQueue(&Q,&key);//将队头的元素赋值给key}elsePush(&temp,e1);}while(!StackEmpty(temp))//将魔王说的语言规则地压入栈s中{Pop(&temp,&e1);if(e1!=flag)Push(&S,e1);//把括号外的元素压入栈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);elseif(e=='A')printf(%s,A);elseprintf(%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(一只);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;case'B':printf(天上一只鹅地上一只鹅);break;case'A':printf(上一只鹅);break;default:printf((对不起此处为非法字符或词汇!));break;}}printf(\n);}printf(再次输入魔王语言(按数字键0退出)\n);scanf(%d,&xunhuan);}return0;}四、调试分析编译环境为CodeBlocks。

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功