魔王语言 数据结构试验报告
数据结构 课程设计报告 魔王语言解释
题目:魔王语言解释[问题描述]有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没有人能听懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α->β1β2……βm(2)(θδ1δ2……δn)—>θδnθδn-1……θδ1θ在这两种形式中,从左到右均表示解释。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话;[基本要求]用下述两条具体规则和上述规则形式(2)实现。
设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。
魔王语言可含人的词汇。
(1)B->tAdA(2)A->sae[测试数据]B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。
[实现提示]将魔王的语言自右至左进栈,总是处理栈顶字符。
若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。
其他情形较简单,请读者思考应如何处理。
应首先实现栈和队列的基本操作。
[源代码]#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 100#define STACK_INCREMENT 10struct Stack{char* base;char* top;int stacksize;};void InitStack(struct Stack &s){//构造栈s.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));s.top=s.base;s.stacksize=STACK_INIT_SIZE;}void Push(struct Stack &s,char e){//压入元素if(s.top-s.base>=STACK_INIT_SIZE){s.base=(char*)realloc(s.base,(s.stacksize+STACK_INCREMENT)*sizeof(char));s.top=s.base+s.stacksize;s.stacksize+=STACK_INCREMENT;}*(s.top)=e;s.top++;}void Pop(struct Stack &s,char &e){//取出元素e=*--s.top;}int StackEmpty(struct Stack s){//栈是否为空if(s.top==s.base){return 1;}else{return 0;}}void ClearStack(struct Stack &s){s.top=s.base;}struct Queue{char data;struct Queue* next;};struct LinkQueue{struct Queue* front;struct Queue* rear;};void InitQueue(struct LinkQueue &q){//构造队q.front=q.rear=(struct Queue*)malloc(sizeof(struct Queue));q.front->next=NULL;}void EnQueue(struct LinkQueue &q,char e){//元素入队struct Queue* p;p=(struct Queue*)malloc(sizeof(struct Queue));p->data=e;p->next=NULL;q.rear->next=p;q.rear=p;}void DeQueue(struct LinkQueue &q,char &e){//元素出队struct Queue* 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(struct LinkQueue q){//队是否为空if(q.front==q.rear){return 1;}else{return 0;}}void InStack(char* ch,struct Stack &s){//把字符数组从右至左压入栈中int i,L=0;while(ch[L]!='\0'){L++;}for(i=L-1;i>=0;i--){Push(s,ch[i]);}}int main(){int i=0;char A[]="sae";char B[]="tsaedsae";char flag='0';//flag用来标记处理括号int mark=1;int f=0;struct Stack S;struct Stack temp;//用来处理括号外的元素InitStack(S);InitStack(temp);struct LinkQueue Q;InitQueue(Q);char MoWang[100]="\0";char e1,key,e2,e;printf("************************************************************** \n");printf("* * 欢迎光临广东工业大学**\n");printf("* **************************** *\n");printf("* * 魔王语言解释系统* *\n");printf("* **************************** *\n");printf("* 班级:计算机学院网络工程2007级4班*\n");printf("* 姓名: 黄文龙学号: 3107007087 *\n");printf("************************************************************** \n\n");printf("请输入你想要解释的魔王语言(最多含有一个括号):\n");gets(MoWang);InStack(MoWang,S);//把要解释的魔王语言压入栈中while(!StackEmpty(S)){Pop(S,e1);if(e1=='('){if(StackEmpty(S)){printf("魔王语言错误!\n");mark=0;break;}while(!StackEmpty(S)){Pop(S,e1);if(e1==')'){f=1;break;}else if(!(e1>='a'&&e1<='z')&&!(e1>='A'&&e1<='Z')){ printf("魔王语言错误!\n");mark=0;break;}}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");mark=0;break;}}if(mark==1&&f==1){ClearStack(S);InStack(MoWang,S);while(!StackEmpty(S)){//栈不空时Pop(S,e1);if(e1=='B'){Push(temp,e1);}else if(e1=='A'){Push(temp,e1);}else if(e1=='('){//用队存储括号中的元素Push(temp,flag);//有括号的话就用flag标记Pop(S,e1);while(e1!=')'){EnQueue(Q,e1);Pop(S,e1);}if(!QueueEmpty(Q)){DeQueue(Q,key);}}else{Push(temp,e1);f=0;}}while(!StackEmpty(temp)){//边处理边进栈Pop(temp,e1);if(e1!=flag){//把括号外的元素压入中Push(S,e1);}else{while(!QueueEmpty(Q)){//处理括号中的元素进栈DeQueue(Q,e2);Push(S,key);Push(S,e2);}if(f!=0){//最后还要压一个keyPush(S,key);}}}printf("解释后的语言为:\n");while(!StackEmpty(S)){//依次出栈输出处理后的元素Pop(S,e);EnQueue(Q,e);//元素进队是为了输出对应汉字if(e=='B'){printf("%s",B);}else 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("一只"); 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");}system("pause");return 0;}[读者手册]1、本程序的运行环境为dos操作系统,执行文件为“魔王解释语言.exe”。
数据结构魔王语言实验报告
数据结构与算法实验报告姓名院系学号任课教师指导教师实验地点软件学院实验时间2011年10月29 日实验名称数据结构实验一栈和队列同组人无预习报告(对实验主要内容的认识) 得分实验内容(问题,思路,程序,结果)得分1.题目:魔王语言2.问题描述:有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的;α→β1β2…βm(θδ1δ2…δn)→δnθδn-1θ…δ2θδ1在这两种形式中,从左到右均表示解释。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂得话。
3.算法思想描述(1)算法的思想①我将设置三个堆栈和两个队列处理这个问题,首先将魔王语言自右向左压入堆栈*2(一个用来测试S_3另一个用来操作S_1),然后判断此句话中是否有括号,若无则直接将操作堆栈弹出到队列中然后输出;②若有括号则先弹出操作堆栈S_1到队列Q_1中,遇到"("时跳过这个括号然后将括号后面的第一个字母标记(记作A ),将除第一个字母外的其他字母弹出到队列Q_2中,直到遇到")"为止,将“)”弹出;③将Q_2的元素每后面一个加原来的第一个元素A 压入堆栈S_2;④将堆栈S_2的元素弹出到Q_1中,然后将S_1中剩余的元素弹出到Q_!; ⑤按照对应的字母翻译即可。
(2)算法流程图开始 是否有括号 直接将堆栈中的弹出入队列翻译输出 将魔王语言自右向左压入堆栈S_1 NO YES 将堆栈S_1中的元素弹出到Q_1 弹出元素为"(" YES NO 弹出(后第一个元素记为A 将剩余元素弹入队列Q_2中 NO弹出元素为)YES将Q_2元素每个加A压入栈S_2将S_2中的元素弹出到Q_1中将S_1中剩余元素弹出到Q_1中翻译后输出结果结束4.数据结构描述(描述解决问题用到的数据结构)(1)所用数据结构的描述S_1堆栈负责自右向左存放魔王语言S_2堆栈存放处理过的括号里的语言S_3堆栈负责判断是否有括号Q_1队列存放处理后的语言Q_2队列负责存放括号中的语言(2)函数功能说明及函数的实现源代码①堆栈实现#ifndef STACK_H_INCLUDED#define STACK_H_INCLUDED#include<stdio.h>#include<math.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 100#define STACK_INIT_MAX 100#define STACKINCREMENT 10#define ERROR 0#define OK 1#define FALSE 0#define TRUE 1typedef int Status;typedef struct{ //顺序栈类型定义char *top;char *base;int stacksize;}SqStack;Status InitStack(SqStack &s){ //构造一个空栈ss.base=(char *)malloc(STACK_INIT_MAX*sizeof(char)); if(!s.base) exit(OVERFLOW); //存储分配失败s.top = s.base;s.stacksize = STACK_INIT_MAX;return OK;}Status Pop(SqStack &s,char &e){ //删除s的栈顶元素,并以e返回其值if(s.top == s.base) return FALSE;s.top--;e = *(s.top);return TRUE;}Status Push(SqStack &s,char e){ //在栈s的栈顶插入新的栈顶元素e if((s.top-s.base) >= s.stacksize){s.base=(char*)realloc(s.base,(s.stacksize+STACKINCREMENT) * sizeof(char));if(!s.base) exit(OVERFLOW); //存储分配失败s.top = s.base + s.stacksize;s.stacksize += STACKINCREMENT;}*s.top = e;s.top++;return OK;}Status DestroyStack(SqStack &s){ //销毁栈sfree(s.base);s.stacksize = 0;return OK;}void InStack(char* ch,SqStack &s){//把字符数组从右至左压入栈中int i,L=0;while(ch[L]!='\0'){L++;}for(i=L-1;i>=0;i--){Push(s,ch[i]);}}Status StackEmpty(SqStack s){//栈是否为空if(s.top==s.base){return 1;}else{return 0;}}#endif // STACK_H_INCLUDED②队列实现#ifndef QUEUE_H_INCLUDED #define QUEUE_H_INCLUDED #include<stdio.h>#include<math.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 100#define ERROR 0#define OK 1#define FALSE 0#define TRUE 1typedef struct{ //循环队列类型定义char *base;int front;int rear;}SqQueue;Status InitQueue(SqQueue &q){ //构造一个空队列qq.base = (char *)malloc(MAXSIZE*sizeof(char));if(!q.base) exit(OVERFLOW); //存储分配失败q.front = q.rear = 0;return OK;}Status EnQueue(SqQueue &q,char e){ //插入元素e为q的新的队尾元素if((q.rear+1) % MAXSIZE == q.front) return ERROR;q.base[q.rear] = e;q.rear = (q.rear + 1) % MAXSIZE;return OK;}Status DeQueue(SqQueue &q,char &e){ //若队列不空,则删除q的对头元素,用e返回其值,//并返回OK;否则返回ERRORif(q.front == q.rear) return ERROR;e = q.base[q.front];q.front = (q.front + 1) % MAXSIZE;return OK;}Status DestroyQueue(SqQueue &q){ //销毁队列q,q不再存在free(q.base);return OK;}#endif // QUEUE_H_INCLUDED③main函数实现#include <iostream>#include"Stack.h"#include"Queue.h"int main(){int length,i,mark; //length表示魔王语言的长度,mark为"("数mark=0;char e,str,j; //e为插入值或删除值,str为重复打印的字符,j为检测符char MoWang[100];//用来储存魔王的语言SqStack S_1;SqStack S_2;SqStack S_3;//检测栈InitStack(S_1);//初始化堆栈InitStack(S_2);InitStack(S_3);SqQueue Q_1;SqQueue Q_2;InitQueue(Q_1);//初始化队列InitQueue(Q_2);printf("请输入魔王的语言:\n");scanf("%s",&MoWang);//将魔王语言存入数组中length=strlen(MoWang);//魔王语言的长度包括括号i=0;InStack(MoWang,S_1);//将魔王语言自右向左入栈InStack(MoWang,S_3);//检测魔王语言while(!StackEmpty(S_3)){Pop(S_3,j);if(j=='('){mark=1;}}if(mark==1){while(e!=')'){//处理")"之前的元素Pop(S_1,e);if(e=='('){Pop(S_1,str);//记录需要重复打印的字符while(e!=')'){Pop(S_1,e);EnQueue(Q_2,e);//将括号内的元素入队列i++;}break;}EnQueue(Q_1,e);//将"("外的元素存入第一个队列中}for(;i>2;i--)//将括号内除了第一个和最后一个元素,其他元素连同第一个元素分次入栈{DeQueue(Q_2,e);//将队列中的第一个元素弹出存入ePush(S_2,e);//将e压入s_2中Push(S_2,str);//将str压入s_2中}DeQueue(Q_2,e);//将括号中的最后一个元素弹出存入ePush(S_2,e);//将e压入s_2中//将s_2堆栈中的元素弹出到队列Q_1中while(!StackEmpty(S_2)){Pop(S_2,e);EnQueue(Q_1,e);}while(!StackEmpty(S_1))//将魔王语言")"后的读入到Q_1中{Pop(S_1,e);EnQueue(Q_1,e);}}else{//若无括号直接输入while(!StackEmpty(S_1)){Pop(S_1,e);EnQueue(Q_1,e);}}while(Q_1.front!=Q_1.rear){DeQueue(Q_1,e); //删除队首元素switch(e) //判断并打印翻译后的语言{case 't': printf("天");break;case 'd': printf("地");break;case 's': printf("上");break;case 'a': printf("一只");break;case 'w': printf(",");break;case 'e': printf("鹅");break;case 'z': printf("追");break;case 'g': printf("赶");break;case 'x': printf("下");break;case 'n': printf("蛋");break;case 'i': printf("恨");break;case 'A': printf("上一只鹅");break;case 'B': printf("天上一只鹅地上一只鹅");break;default: printf("error!!!");}}printf("\n"); //换行DestroyQueue(Q_1);DestroyQueue(Q_2); //释放队列qDestroyStack(S_1); //释放栈s DestroyStack(S_2);return 0;}5.测试结果翻译成功结果如下图:实验结论得分成功利用堆栈和数组完成魔王语言的翻译教师评价总分实际得分。
魔王语言解释(数据结构实习报告)
课程实验报告实习报告一:需求分析(1)以一维数组demon[ i ]表示魔王语言.(2)魔王语言由用户输入,初始保存在demon[ i ]中.(3)魔王语言与人类语言对应关系固化在程序中.(4)实现过程:A:初始,魔王语言接收后存放在demon[ i ]中.B:初次遍历数组,将数组中括号内的元素入栈,同时插入相应首字母;C:再次遍历数组,将数组元素依次入队。
(小写字母直接入队;大写字母经翻译成相应字符后入队;遇到括号,将栈中保存的元素依次出栈入队)在翻译过程中,如果依旧包含大写字母,则置flag为1,否则为0。
D:将队列中元素赋值给demon[ i ]。
如果此时flag=1,则再次重复C过程。
直至所有元素为人类语言。
E:输出demon[ i ]。
此时数组中元素为对应的人类语言。
注:如果程序中没有相应的对应关系,则翻译成“???”。
二:概要设计:1:设定栈的抽象数据类型定义:ADT stack{数据对象:D={ai|ai∈CharSet,i=1,2,…,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}基本操作:initstack (&s)操作结果:构造一个空栈s.push (&s,e)初始条件:栈s已存在.操作结果:在栈s的栈顶插入新的栈顶元素e.pop(&s,&e)初始条件:栈s已存在.操作结果:删除s的栈顶元素,并以e返回其值.}ADT stack2:设定队列的抽象数据类型:ADT queue{数据对象:D={ai|ai∈Elemset,i=1,2,…,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}基本操作:initqueue(&q)操作结果: 构造一个空队列q.enqueue(&q, e)初始条件: 队列q已存在.操作结果: 插入元素e为q的新队尾元素.dequeue(&q,&e)初始条件: q为非空队列.操作结果: 删除q的队头元素,并用e返回其值. }ADT queue3:本程序包含四个模块:1)主函数模块.其中主函数为:status main(){初始化栈;初始化队列;接收魔王语言输入到数组demon[i ];遍历数组将括号中元素进栈;while(数组demon[i ]中元素有大写字母){ 翻译排序处理后入队列;将对列元素保存在数组demon[i ];}输出人类语言(数组demon[ i]);}2)括号内元素入栈处理模块.tempstack(&temps)将括号内元素入栈,依次插入首字符.举例:(abcd)->adacaba.3)排序入队列模块.sort(&s,&q){遍历数组;{遇到小写字母,直接入队列;遇到大写字母,翻译大写后入队列;遇到括号,将栈中保存的元素依次出栈入队列;}}4)翻译大写处理模块.spenqueue(&*q,key){switch(key){找到各个大写字母对应的字符串. 没有相应的则解释为’???’}}各模块之间调用关系:主函数模块{括号内元素入栈处理模块;排序入队模块{翻译大写处理模块;}}三:详细设计1.定义全局变量#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define NULL 0#define OVERFLOW -2#define MAXSIZE 100#define stack_init_size 100#define stackincrement 10typedef char selemtype;typedef char qelemtype;typedef char elemtype;typedef int status;char e;char demon[MAXSIZE];2.栈类型及其基本操作typedef struct{selemtype *base;selemtype *top;int stacksize;}sqstack;status initstack (sqstack *s){s->base=(selemtype *)malloc(stack_init_size*sizeof(selemtype));if(!s->base) exit (OVERFLOW);s->top=s->base;s->stacksize=stack_init_size;return OK;}/*创建栈*/status push (sqstack *s,selemtype e){if(s->top-s->base>=s->stacksize){s->base=(elemtype *) realloc(s->base,(s->stacksize+stackincrement)*sizeof(elemtype)); if(!s->base) exit(OVERFLOW);s->top=s->base+s->stacksize;s->stacksize+=stackincrement;}*(s->top++)=e;return OK;}/*入栈*/status pop(sqstack *s,selemtype *e){if(s->top==s->base) return ERROR;*e=*(--(s->top));return OK;}/*出栈*/3.队列类型及其基本操作typedef struct qnode{qelemtype data;struct qnode *next;}qnode,*queueptr;typedef struct{queueptr front;queueptr rear;}linkqueue;status initqueue(linkqueue *q){q->front=q->rear=(queueptr)malloc(sizeof(qnode));if(!q->front) exit(OVERFLOW);q->front->next=NULL;return OK;}/*创建队列*/status enqueue(linkqueue *q,qelemtype e){queueptr p;p=(queueptr)malloc(sizeof(qnode));if(!p) exit(OVERFLOW);p->data=e;p->next=NULL;q->rear->next=p;q->rear=p;return OK;}/*入队*/status dequeue(linkqueue *q,qelemtype *e){queueptr p;if(q->front==q->rear) return ERROR;p=q->front->next;*e=p->data;q->front->next=p->next;if(q->rear==p){q->rear=q->front;}free(p);return OK;}/*出队*/4.括号内元素入栈处理函数void tempstack(sqstack *temps){int i=0;char t;char c;c=demon[i ];for(i=0;c!='#';i++)/*遍历数组*/{c=demon[i ];if(c=='(')/*遇到开括号*/{t=demon[i+1];/*取括号中的首字母*/push(temps,t);/*入栈*/i++;/*指向首字母*/do{i++;c=demon[i ];push(temps,c)/*第一次循环将次字母入栈*/; push(temps,t);/*再将首字母进栈*/}while(c!=')');/*直到括号中元素全部进栈*/pop(temps,&t);/*将多余进栈的首字母t出栈*/pop(temps,&t); /*将多余进栈的’)’出栈*/ } } }/*临时栈*/5.特殊入队函数void spenqueue(linkqueue *q,char key){int j=0;char a[5];switch(key) /*判断大写字母对应的字符串*/{case'A':strcpy(a,"sae");break;case'B':strcpy(a,"tAdA");break;case'C':strcpy(a,"abc");break;case'D':strcpy(a,"def");break;case'E':strcpy(a,"ghi");break;case'F':strcpy(a,"klm");break;case'H':strcpy(a,"mop");break;default:strcpy(a,"???"); /*不能翻译的魔王语言以”???”输出*/}while(a[j]!='\0') /*如果数组还有字母*/{enqueue(q,a[j]);/*进队*/j++;}}/*特殊入队*/6.排序入队处理函数status sort(sqstack *s,linkqueue *q){ qnode b;int flag=0;/*大写字母监视哨置零*/int i;for(i=0;demon[ i]!='#';i++)/*遍历数组*/{b.data=demon[ i];if( ('a'<=b.data&&b.data<='z') || b.data=='?') /*如果是小写字母或者’?’则直接入队*/ { enqueue(q,b.data);}else{ if('A'<=b.data&&b.data<='Z') /*如果是大写字母,则调用特殊入队函数,*/{ spenqueue(q,b.data);flag=1; /*发现大写字母监视哨置1*/}else{ if(b.data=='(')/*如果是括号*/{ do{ pop(s,&e);enqueue(q,e);}while(!(s->top==s->base)); /*只要栈不为空,则出栈进队*/while (b.data!=')') /*只要还指向括号内元素,就继续往后移,保证原括号内的元素不再进栈*/{ i++;b.data=demon[ i]; }}}}}return flag;}/*排序*/status main(){ sqstack s1;linkqueue q1;int k=0;int flag=1;clrscr();printf("\n\n\n\t\t\tWELCOME!\n");printf("\t***************************************\n");printf("\tPlease Input The Demon's Words:\n\t");printf("!: Less Than 30 Letters: )\n\t");printf("!: Please Stop By '#': )\n\t");printf("***************************************\n\t");printf("The Demon's Words:\n\t");scanf("%s",demon);printf("\n\t***************************************");initstack(&s1); /*创建栈*/initqueue(&q1); /*创建队*/tempstack(&s1); /*调用函数*/while (flag==1) /*如果有大写字母*/{ k=0;flag=sort(&s1,&q1);while(q1.front!=q1.rear) /*重写demon[i ]*/{dequeue(&q1,&e);demon[k]=e;k++;}demon[k]='#';}demon[k]='\0';printf("\n\tThe Human's Words:\n\t%s",demon);printf("\n\n\t***************************************");printf("\n\t\t\tTHANK YOU!\n\t");printf("Please press any key to exit...");if(getch()) exit(1);}}/*主函数*/四:调试分析1. 函数调用比较多,因而得仔细对待数值和地址的传递.2. 由于魔王语言中’B’中仍然包含着大写字母(tAdA).所以考虑设置flag.3. 函数数组遍历.进栈出栈.入队出队中都要牵扯指针的移动,所以要仔细考虑一循环的条件以及进栈元素的个数.五:用户手册1. 本程序运行环境为DOS/WINDOWS操作系统,执行文件为:魔王语言解释.exe。
魔王语言实验报告材料
数据结构实验报告(魔王语言)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)魔王语言的解释规则:大写字母表示魔王语言的词汇,小写字母表示人的词汇语言,魔王语言中可以包含括号,魔王语言的产生式规则在程序中给定,当接收用户输入的合法的魔王语言时,通过调用魔王语言翻译函数来实现翻译。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)抽象数据类型:typedef struct{StackElementType elem[Stack_Size];int top;}SeqStack;主程序模块:int main(){GhostLanage();printf("\n\t按任意键退出\n\n");}各子程序模块:/*初始化栈*/void InitStack(SeqStack *s){s->top=-1;}/*进栈操作*/void Push(SeqStack *s,StackElementType x){if(s->top==Stack_Size-1)printf("\n\t栈已满! ");else {s->top++;s->elem[s->top]=x;}}/*出栈操作*/void Pop(SeqStack *s,StackElementType *x){if(s->top==-1)printf("\n\t栈为空! ");else {*x=s->elem[s->top];s->top--;}}/*取栈顶元素*/void GetTop(SeqStack *s,StackElementType *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 GhostLanage(){SeqStack B,A,s,B1,A1,r,M;StackElementType ch,ch1,ch2,x;char aa[100];int choice,i=0,n;InitStack(&B);InitStack(&A);InitStack(&s);InitStack(&r) ;InitStack(&M);printf("魔王语言的转换形式: B->tAdA A->sae");Push(&B,'t');Push(&B,'A');Push(&B,'d');Push(&B,'A');Push(&A,'s');Push(&A,'a');Push(&A,'e');printf("\n请输入要翻译的魔王语言:\n");scanf("%s",aa);for(i=0;aa[i]!='\0';i++)Push(&s,aa[i]);while(IsEmpty(&s)){Pop(&s,&ch);if(ch=='B'){B1=B;while(IsEmpty(&B1)){Pop(&B1,&ch1);if(ch1=='A'){A1=A;while(IsEmpty(&A1)) {Pop(&A1,&ch2); Push(&r,ch2); }}else Push(&r,ch1);}}else if(ch=='A'){A1=A;while(IsEmpty(&A1)) {Pop(&A1,&ch2); Push(&r,ch2); }}else if(ch==')'){Pop(&s,&ch2);while(ch2!='('){Push(&M,ch2);Pop(&s,&ch2);}GetTop(&M,&ch2);x=ch2;Pop(&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-不继续)"); 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 ;}三、【实现描述(Implement)】(30%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。
魔王语言报告(带有完整程序)
郵電學院数据结构课程设计报告题目:魔王语言院系名称:专业名称:班级:学生:学号(8位):指导教师:设计起止时间:一. 设计目的以栈和队列为数据结构,使用文件读写、查找等操作,完成对魔王语言的解释。
二. 设计容有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂。
但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α→β1β2 ……βm(2)(θδ1δ2 ……δn)→θδnθδn-1 …… θδ1 θ在这两种形式中,从左到右均表示解释;从右到左均表示抽象。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
三.概要设计通过栈、队列和函数的调用来实现魔王语言。
12.各个模块详细的功能描述。
1.通过打开规则文件读取文件中的数据,并将其保存在数组r 中2.通过打开小写字母匹配文件读取文件中的数据,并将其存储在链表head 中。
3.通过这个函数将所有的魔王语言存储在栈中。
4.通过这个函数将魔王语言中所有的括号去掉,并将其结果存储在队列Q 中5.通过这个函数,根据规则文件,将去掉括号后的魔王语言中的大写字母全部转换为小写字母 6通过这个函数,根据小写字母匹配文件,将小写字母全部翻译为人类语言。
7.通过这个文件将翻译好的魔王语言保存在结果文件中,并为文件加密。
四.详细设计1.功能函数的调用关系图1.Open-rule()、Open-mean()keep()和translate()函数无调用其他自己设定的函数; 2.Pushall()函数调用关系图3. Test_brack( );函数调用关系图4.dealUpletter();函数调用关系图5. password( );函数的调用关系图2.各功能函数的数据流程图dealUpletter函数的流程图:brack()函数的流程图:brack()函数中的for循环语句:forfor循环语句中的while语句2的流程图:for循环语句中的if语句的流程图:3.重点设计及编码void brack(LinkStack top,LinkQueue * Q)//处理括号{int n,k,s,i;LinkStackNode * p;LinkStack top1;char x,y,ch;n=0;for(p=top->next;p!=NULL;p=p->next)if(p->data == '(')n++; //记录括号的个数for(i=1;i<=n;i++){for(s=0;s<n-i+1;){Pop(top,&x); //将最层括号外的数据存在下层栈if(x == '(')s++;if(s!=n-i+1)EnterQueue(Q,x);}InitStack(&top1);k=0;while(top->next->data != ')' ) //将最层的括号的字母逆序存储在辅助栈{Pop(top,&x);if(k==0)ch=x; //记录最层括号第一个字母Push(top1,x);k++;}Pop(top,&y); //最层括号)出栈k=0; //处理最层括号的容Pop(top1,&y);while(top1->next != NULL){if(k%2 == 0)EnterQueue(Q,ch); //把最层的括号的容插入队列中if(k%2 == 1){EnterQueue(Q,y);Pop(top1,&y);}k++;}EnterQueue(Q,ch);while(top->next!=NULL){Pop(top,&x);EnterQueue(Q,x); //将最层括号)外的字母存到队列中}if(i!=n){InitStack(&top);while(Q->front->next != NULL){ch = Q->front->next->data;DeleteQueue(Q,&ch); //处理外层括号,将队列中的数据存储在栈中Push(top1,ch); //按照队列的存储数据存储到栈top中,top为辅助栈}while(top1->next!=NULL){Pop(top1,&ch);Push(top,ch);}InitQueue(Q); //最后的结果存储在队列中}}}void dealUpletter(LinkQueue * Q,struct rule *r,LinkQueue* Q1) //处理大写字母{LinkQueueNode * q;char ch;int flage;InitQueue(Q1);while(Q->front->next != NULL){DeleteQueue(Q,&ch);if(ch<='Z' && ch>='A')alter(ch,r,Q,Q1);elseEnterQueue(Q1,ch);}flage = 0;for(q=Q1->front->next;q!=NULL;q=q->next) //查询是否含有大写字母if(q->data>='A' && q->data <= 'Z')flage = 1;if(flage == 1){while(Q1->front->next != NULL){DeleteQueue(Q1,&ch);EnterQueue(Q,ch);}dealUpletter(Q,r,Q1);}}五.测试数据及运行结果1.正常测试数据和运行结果1.魔王说的话B(ehnxgz)B解释成人类语言:tsaedsaeezegexenehetsaedsae将魔王语言翻译成汉语:天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅2. 魔王说的话A(hnxB(egz)xh)解释成人类语言:saehhhxhehghehzhehtsaedsaehxhnh将魔王语言翻译成汉语:上一只鹅恨恨恨下恨鹅恨赶恨鹅恨追恨鹅恨天上一只鹅地上一只鹅恨下恨蛋恨3. 魔王说的话se(heasan)d解释成人类语言:sehnhahshahehd将魔王语言翻译成汉语:上鹅恨蛋恨一只恨上恨一只恨鹅恨地异常测试数据及运行结果1、输入:魔王说的话()输出:解释成人类语言将魔王语言翻译成汉语2、输入:输入:魔王说的话se输出:解释成人类语言se将魔王语言翻译成汉上鹅六.调试情况,设计技巧及体会语:1.改进方案此次魔王语言的设计,合理之处:使用链式存储结构,位置确定,可以简化思维过程。
魔王语言实验报告
数据结构课程设计报告题目:魔王语言系部名称:通信工程专业名称:班级:学号:学生姓名:指导教师:时间:一、课程设计目的(1)熟练掌握C语言和数据结构的相关操作。
(2)综合应用C语言的知识和数据结构的知识,编写程序,并且对以前所学的知识进行复习。
( 3 ) 培养学生独立完成课程设计的能力。
二、课程设计内容1.用带头结点的动态单链表来存储多项式;在此基础上完成多项式乘法运算要求以动态链表为存储结构、使用到查找和排序等操作;在创建多项式的过程中,可以按指数的任意顺序输入,并且可在同一多项式中输入指数相同的多项;在进行乘法操作之前,输出参与操作的两个多项式。
要求输出的多项式按指数降序排列,同指数的多项合并,项数的正负号显示合理。
2.魔王语言有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂。
但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α→β1β2 ……βm(2)(θδ1δ2 ……δn)→θδnθδn-1 ……θδ1 θ在这两种形式中,从左到右均表示解释;从右到左均表示抽象。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
读取文件,并统计1. 读取文本文件(rule.txt), 将具体规则的对应关系读入数组或链中2. 读取文本文件(mean.txt), 将小写字母及其对应的含义读入数组或链表中处理规则形式(2)按照规则形式(2)处理魔王所说的话。
处理完毕后,对应的解释语句不再含有()。
处理规则形式(1)按照读入的具体规则,对上一步处理的结果进行规则形式(1)的处理,得到魔王所说的话的人类语言结果。
写结果文件按照所读入的小写字母对应的文字含义,将翻译成的人类语言转换成文字语句,写入文件result.txt中。
读取文件,并统计1. 读取文本文件(rule.txt),将具体规则的对应关系读入数组或链表中2. 读取文本文件(mean.txt), 将小写字母及其对应的含义读入数组或链表中处理规则形式(2)按照规则形式(2)处理魔王所说的话。
魔王语言实习报告
数据结构实验报告栈和队列及其应用题目:魔王语言的解释物联网1班陈世超 14051411 2015-11-23一.需求分析1 以栈保存魔王语言。
2.魔王语言由用户输入,保存在栈中3.魔王语言与人类语言对应转化二.概要设计为了实现上述操作,应以栈和队列为主。
1.基本操作:IntStack(&s )操作结果:构造空栈sPush(&s,e)在栈s的栈顶插入新元素ePop(&s,e)删除s的栈顶元素,并以e返回其值。
2.本程序包含三个模块:(1)主程序模块;(2)构造栈和队列的各种操作;(3)输出人类语言;三.详细设计1.元素类型,结点类型和指针类型:class Stack{public:char *base;char *top;int stacksize;};class Node{public:char date;class Node*next;};class Queue{public:class Node *front,*rear;};2.每个模块的分析:创建栈,队列,队列节点,队列和栈的操作:void Intstack(Stack &s)//构造空栈{s.base=new char[MAXSIZE];if(!s.base){cout<<"创建栈失败"<<endl;return;}s.top=s.base;s.stacksize=MAXSIZE;return;}void push(Stack &s,char e)//将元素e压入栈,top指向栈顶的下一个空白地方{if(s.top-s.base>=s.stacksize){s.base=new char[MAXSIZE*sizeof(char)];char* temp =new char(s.stacksize+MAXSIZE);memmove(temp,s.base,MAXSIZE*sizeof(char));delete []s.base;s.base=temp;if(!s.base){cout<<"构栈失败"<<endl;return;}s.top=s.base+s.stacksize;s.stacksize+=MAXSIZE;}*s.top++=e;}int pop(Stack &s,char &e)//将栈顶的元素赋给e,并且top指向这一个元素{if(s.top==s.base) //栈为空{return -1;}e=*--s.top;return 1;}void Intqueue(Queue &q)//构建空队列{q.front=q.rear=new Node;if(!q.front){cout<<"构队列失败"<<endl;return;}q.front->next=NULL;}void Intqueue(Queue &q,char e)//将元素e放到一个新节点里面,将节点压入队列{struct Node *p;p=new Node;p->date=e;p->next=NULL;q.rear->next=p;q.rear=p;}int Popqueue(Queue &q,char &e)//将队列的第一个元素返回给e,然后删除(front指向第一个元素前的空白部分,rear指向最后一个元素){Node *p;if(q.front==q.rear){return -1;}p=q.front->next;e=p->date;q.front->next=p->next;if(q.rear==p)q.rear=q.front;delete []p;return 1;}从魔王语言右边开始数;for(i=strlen(str)-1;i>=0;i--) //从魔王语言右边开始数{if(str[i]=='(') //输入的元素如果为坐括号{pop(s,e1); //e1为栈顶元素(即为括号内第一个元素)pop(s,e);while(e!=')') //将括号内的全部放入队列里面{Intqueue(q,e); //将元素e加入队列q中pop(s,e); //e元素指向栈的前一个元素}while(Popqueue(q,e)!=-1)//队列不为空{push(s,e1); //将括号内第一个元素压入栈push(s,e); //将从括号内最后一个元素开始往左压入栈}push(s,e1); //最后再将括号内的第一个元素压入栈}elsepush(s,str[i]); //从右往左把B到'('前的部分压入栈}完整的程序:#include<iostream>#include<string>using namespace std;const int MAXSIZE=100;class Stack{public:char *base;char *top;int stacksize;};class Node{public:char date;class Node*next;};class Queue{public:class Node *front,*rear;};void Intstack(Stack &s)//构造空栈{s.base=new char[MAXSIZE];if(!s.base){cout<<"创建栈失败"<<endl;return;}s.top=s.base;s.stacksize=MAXSIZE;return;}void push(Stack &s,char e)//将元素e压入栈,top指向栈顶的下一个空白地方{if(s.top-s.base>=s.stacksize){s.base=new char[MAXSIZE*sizeof(char)];char* temp =new char(s.stacksize+MAXSIZE);memmove(temp,s.base,MAXSIZE*sizeof(char));delete []s.base;s.base=temp;if(!s.base){cout<<"构栈失败"<<endl;return;}s.top=s.base+s.stacksize;s.stacksize+=MAXSIZE;}*s.top++=e;}int pop(Stack &s,char &e)//将栈顶的元素赋给e,并且top指向这一个元素{if(s.top==s.base) //栈为空{return -1;}e=*--s.top;return 1;}void Intqueue(Queue &q)//构建空队列{q.front=q.rear=new Node;if(!q.front){cout<<"构队列失败"<<endl;return;}q.front->next=NULL;}void Intqueue(Queue &q,char e)//将元素e放到一个新节点里面,将节点压入队列{struct Node *p;p=new Node;p->date=e;p->next=NULL;q.rear->next=p;q.rear=p;}int Popqueue(Queue &q,char &e)//将队列的第一个元素返回给e,然后删除(front指向第一个元素前的空白部分,rear指向最后一个元素){Node *p;if(q.front==q.rear){return -1;}p=q.front->next;e=p->date;q.front->next=p->next;if(q.rear==p)q.rear=q.front;delete []p;return 1;}int main(){cout<<"输入魔王语言(100以内)"<<endl;char str[500];cin>>str; //输入魔王语言char e,e1;int i;Stack s;Queue q;int n=0;Intstack(s); //建立空栈Intqueue(q); //建立空队列for(i=strlen(str)-1;i>=0;i--) //从魔王语言右边开始数{if(str[i]=='(') //输入的元素如果为坐括号{pop(s,e1); //e1为栈顶元素(即为括号内第一个元素)pop(s,e);while(e!=')') //将括号内的全部放入队列里面{Intqueue(q,e); //将元素e加入队列q中pop(s,e); //e元素指向栈的前一个元素}while(Popqueue(q,e)!=-1)//队列不为空{push(s,e1); //将括号内第一个元素压入栈push(s,e); //将从括号内最后一个元素开始往左压入栈}push(s,e1); //最后再将括号内的第一个元素压入栈}elsepush(s,str[i]); //从右往左把B到'('前的部分压入栈}while(pop(s,e)!=-1) //栈不为空{switch(e){case 't':cout<<"天";break;case 'd':cout<<"地";break;case 's':cout<<"上";break;case 'a':cout<<"一只";break;case 'e':cout<<"鹅";break;case 'z':cout<<"追";break;case 'g':cout<<"赶";break;case 'x':cout<<"下";break;case 'n':cout<<"蛋";break;case 'h':cout<<"恨";break;case 'A':cout<<"上一只鹅";break;case 'B':cout<<"天上一只鹅地上一只鹅";break;}}return 0;}四.调试结果及说明1.说明(1)本程序的运行环境为C-FREE 5.0。
数据结构的实训报告结果
一、实训目的本次数据结构实训旨在通过实践操作,加深对数据结构理论知识的理解,提高解决实际问题的能力。
通过实训,使学生能够熟练掌握各种基本数据结构及其操作方法,并能够将这些知识应用于解决实际问题。
二、实训环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 20194. 实训教材:《数据结构》(C语言版)三、实训内容本次实训主要内容包括线性表、栈、队列、树、图等基本数据结构的创建、操作和应用。
1. 线性表(1)单链表的创建、插入、删除和查找操作(2)双向链表的创建、插入、删除和查找操作(3)循环链表的创建、插入、删除和查找操作2. 栈(1)栈的创建、入栈、出栈和判断栈空操作(2)应用栈实现括号匹配3. 队列(1)队列的创建、入队、出队和判断队列空操作(2)应用队列实现广度优先搜索4. 树(1)二叉树的创建、插入、删除和遍历操作(2)二叉查找树的创建、插入、删除和查找操作5. 图(1)图的创建、添加边、删除边和遍历操作(2)图的深度优先遍历和广度优先遍历四、实训过程1. 线性表首先,我们学习了单链表、双向链表和循环链表的基本概念和创建方法。
通过编写代码,实现了链表的插入、删除和查找操作。
在实训过程中,我们遇到了一些问题,如链表插入操作时指针的移动、删除操作时避免内存泄漏等。
通过查阅资料和与同学讨论,我们逐步解决了这些问题。
2. 栈接着,我们学习了栈的基本概念和操作方法。
通过编写代码,实现了栈的创建、入栈、出栈和判断栈空操作。
在实训过程中,我们遇到了栈空和栈满的情况,通过设置标志位和循环队列的方法解决了这些问题。
此外,我们还学习了应用栈实现括号匹配,加深了对栈的应用理解。
3. 队列然后,我们学习了队列的基本概念和操作方法。
通过编写代码,实现了队列的创建、入队、出队和判断队列空操作。
在实训过程中,我们遇到了队列空和队列满的情况,通过设置标志位和循环队列的方法解决了这些问题。
数据结构实验报告及心得体会
数据结构实验报告及心得体会一、概述:介绍本次实验的目的、背景以及所使用的实验环境和工具。
本次实验旨在通过实际操作,深入理解和掌握数据结构的原理及应用。
实验背景源于课程学习的理论知识与实际应用相结合的需求,通过实验操作,期望能够将课堂所学的数据结构知识更好地运用到实际编程和解决现实问题中。
本次实验所使用的实验环境为先进的计算机实验室,配备了高性能的计算机硬件和丰富的软件开发工具。
为了完成实验,我使用了Java编程语言,并结合Eclipse开发环境进行编程和调试。
我还参考了相关的数据结构专业书籍和在线资源,以便更好地理解和应用数据结构知识。
在实验过程中,我严格按照实验指导书的步骤进行操作,并认真记录了实验数据和结果。
通过本次实验,我深刻体会到了数据结构的重要性,也对数据结构的实现和应用有了更深入的了解。
二、实验内容:分别介绍线性数据结构(线性表)、非线性数据结构(二叉树、图)的实验内容,包括其实现方法、操作过程等。
每个实验都包含具体的实验目的和预期结果。
三、实验过程及结果分析:详细描述实验过程,包括实验步骤的执行情况,遇到的问题及解决方法。
对实验结果进行展示,并进行数据分析和结论。
这部分是实验报告的核心部分,体现了学生的实践能力和问题解决能力。
四、心得体会:分享在实验过程中的心得体会,包括遇到的困难、收获,对数据结构的理解与认识提升,以及实验过程中的团队协作和学习体验等。
这部分内容可以体现出学生的思考深度和学习的主观感受。
五、总结与展望:对本次实验报告进行总结,并对未来数据结构与算法的学习提出展望和建议。
这部分内容可以帮助学生梳理所学知识,明确未来的学习方向。
语言数据结构实验报告链表的合并-7页word资料
《数据结构》实验报告◎实验题目:合并两个链表:设A与B分别为两个带有头结点的有序循环链表(所谓有序是指链接点按数据域值大小链接,本题不妨设按数据域值从小到大排列),list1和list2分别为指向两个链表的头指针。
请写出将这两个链表合并为一个带头结点的有序循环链表的算法。
◎实验目的:使用顺序表的创建、插入、删除、合并等操作编写关于数据结构的程序。
◎实验内容:写出程序并上机调试、通过。
一、需求分析1、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“Please input the first list”时输入第一个链表的元素个数和元素。
当出现“Please input the second list”时输入第二个链表的元素个数和元素。
然后计算机终端输出合并后的链表。
2、输出的形式为两个链表中的元素合并成一个链表并且其中元素按照递增的顺序排列。
3、程序执行的命令包括:(1)构造含n个元素的循环链表;(2)输入数据;(3)将输入的数据作成循环链表;(4)合并;(5)输出;(6)结束。
4、本程序能将两个链表合并成一个链表。
并且合并后的链表中的元素是原来两个链表中的元素按照递增顺序的排列。
5、输入及输出示例:例1:Please input the first list41 3 7 9Please input the second list51 2 5 6 8Output the mergelist1 2 3 5 6 7 8 9Press any key to continue例2:Please input the first list51 2 5 9 11Please input the second list31 2 8Output the mergelist1 2 5 8 9 11Press any key to continue二概要设计1.基本操作本程序中,用单向有序循环链表作为存储结构。
数据结构实验实训总结报告
一、实验背景随着计算机技术的飞速发展,数据结构作为计算机科学的重要基础,已经成为现代软件开发和数据处理的关键技术。
为了提高学生的数据结构应用能力,我们学校开设了数据结构实验实训课程。
本课程旨在通过实验实训,使学生深入理解数据结构的基本概念、性质、应用,掌握各种数据结构的实现方法,提高编程能力和解决实际问题的能力。
二、实验内容本次数据结构实验实训主要包括以下内容:1. 数据结构的基本概念和性质通过实验,使学生掌握线性表、栈、队列、串、树、图等基本数据结构的概念、性质和应用场景。
2. 数据结构的存储结构通过实验,使学生熟悉线性表、栈、队列、串、树、图等数据结构的顺序存储和链式存储方法,了解不同存储结构的优缺点。
3. 数据结构的操作算法通过实验,使学生掌握线性表、栈、队列、串、树、图等数据结构的插入、删除、查找、遍历等基本操作算法。
4. 数据结构的实际应用通过实验,使学生了解数据结构在各个领域的应用,如网络数据结构、数据库数据结构、人工智能数据结构等。
三、实验过程1. 实验准备在实验开始前,教师首先对实验内容进行讲解,使学生了解实验目的、实验步骤和实验要求。
同时,教师要求学生预习实验内容,熟悉相关理论知识。
2. 实验实施(1)线性表:通过实现线性表的顺序存储和链式存储,实现插入、删除、查找等操作。
(2)栈和队列:通过实现栈和队列的顺序存储和链式存储,实现入栈、出栈、入队、出队等操作。
(3)串:通过实现串的顺序存储和链式存储,实现串的插入、删除、查找等操作。
(4)树:通过实现二叉树、二叉搜索树、平衡二叉树等,实现树的插入、删除、查找、遍历等操作。
(5)图:通过实现图的邻接矩阵和邻接表存储,实现图的插入、删除、查找、遍历等操作。
3. 实验总结实验结束后,教师组织学生进行实验总结,总结实验过程中的收获和不足,提出改进措施。
四、实验成果通过本次数据结构实验实训,学生取得了以下成果:1. 掌握了数据结构的基本概念、性质和应用场景。
魔王语言解释数据结构课程设计报告.doc
魔王语言解释程序一、问题引入1.问题描述有一个魔王总是使用自已的一种非常精练而抽象的语言讲话,没有人能听得懂。
但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α →β 1β 2⋯β m(2) ( θ β1β 2⋯βm)→ ( θβ m⋯β 2θ β 1θ )在这两种形式中,从左到右均表示解释。
写一个魔王解释程序,将魔王的话解释成人能听懂的话。
2.基本要求用下述两种规则和下述规则(2)实现。
设大写字母表示魔王语言的词汇,小写字母表示人的词汇,希腊字母表示可以用大写字母或小写字母代换的变量。
魔王语言可含人的词汇。
(1) B → tAdA(2) A → sae3.测试数据B(einxgz)B解释成tsaedsaeezegexeneietsaedsae“天上一只鹅地上一若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。
t d s a e z g x n h 天地上一只鹅追赶下蛋恨4.实现提示将魔王的语言自右至左进栈,总是处理栈顶字符。
若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列在处理后入栈。
5.本程序采用的是顺序栈。
基本操作列表:(1)据括号的个数设一个标记。
记下括号的位置。
(2)根据标记来执行依次的操作。
(3)没有括号,直接进队,据翻译函数2 输出人的语言。
(4)有括号,分为括号内的和括号外的。
,根据括号的位置:括号外的从右到左入栈;括号内的从左到右入栈,并且依次插入括号内的第一个字符。
据翻译函数 2 出栈并且翻译。
二、需求分析1.本演示程序中,魔王语言限制在小写字母‘a’ - ‘z’之间,且必须限制在括号内以及大写字母 A 和 B。
且允许出现重复字符或非法字符,程序运用时自动过滤去,输出的运算结果中将不含重复字符和非法字符。
2.魔王语言遵守如下规则:(θ δ 1δ 2δ 3⋯δ n)θ δ nθδ n-1 ⋯θδ 1θB tAdA A sae3.演示程序以用户和计算机对话的形式进行,即在计算机终端中显示提示信息之后,有用户自行选择下一步命令,相应输入数据和运算结果在其后显示。
数据结构课程设计报告-魔王语言实验报告模板
西安郵電學院数据结构课程设计报告题目:魔王语言院系名称:计算机学院专业名称:软件工程班级:学生姓名:学号(8位):指导教师:设计起止时间:一. 设计目的1、熟悉链表、队列、栈、排序、查找、文件等内容的的使用。
2、将数据结构的内容结合到一起使用。
3、熟悉掌握数据结构的内容。
4、了解递归与非递归的使用。
二. 设计内容以栈和队列为数据结构,使用文件读写、查找等操作,完成对魔王语言的解释。
三.概要设计1.功能模块图;开始主函数输入魔王说的话调用取括号函数读取文件rule.txt 读取文件mean.txt将栈中的元素存入数组中将魔王的话转化成小写字母将魔王语言翻译为汉语意思将结果保存到文件中结束2.各个模块详细的功能描述。
1.入栈操作函数int push(Stack *s,char x)讲传递过来的字符入栈;2.出栈操作char pop(Stack *s)将当前栈顶的字符出栈,并将其返回;3.入队操作函数int queue_in(Queue *p,char ch)将传递过来的ch中的字符入队;4.出队操作char queue_out(Queue *p)将当前队头的字符出队,并将其返回;5.去除魔王语言中括号模块void deletenode(Stack *s,Queue *r,char a[],int i)利用队栈的进栈出栈操作,入队出队操作,将魔王语言中的括号去除,使之成为一个字母的序列;6 .文件读取函数void read_file(),void word_file()通过文件函数,读取rule和mean文件,并将其输出到终端;7.将栈中的元素存入数组中void store(char a[],Stack *s)将栈中的元素按次序存入到数组中;8. 魔王语言转字母语言void change(char a[])将输入的魔王语言通过循环判断转换成字母语言;9 .将字母语言翻译为人类语言void translate(char a[],struct Word *h)将已经由魔王语言转换成的字母语言通过对照转换成人类语言10.文件保存函数void save_file(struct Word *h)将已经转换好的魔王语言保存到自定义路径。
魔王语言实验报告
数据结构课内实验报告书一、实验题目:魔王语言解释二、实验目的:通过本次实验,熟练掌握抽象数据类型栈和队列的实现,学会使用栈和队列解决具体应用问题,从而体会栈和队列的特点。
三、实验要求:有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释承认能听懂的语言,因为他的语言是有以下两种形式的规则由人的语言逐步抽象上去的:(1)α→β1β2…βm(2)(θδ1δ2…δn)→θδnθδn-1…θδ1θ在这两种形式中,从左到右均表示解释。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
要求:用下述两条具体规则和上述规则形式(2)实现。
设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。
魔王语言可含人的词汇。
(1)B→tAdA(2)A→sae四、测试数据:B(ehnxgz)解释成Btsaedaseezegexenehetsaedsae若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。
五、设计与实现过程(1)栈或队列的定义及其主要操作的实现typedef struct{char *top;char *bace;}Node;(2)主要算法的描述①、定义变量#define STACK_INIT_SIZE 100 #define STACK_INCREMENT 10②、主要代码:int print(Node *stack, char *bace){while(bace != stack->top) {printf("%c", *bace);bace++;}return 0;}int fun(Node *stack, char top[], char array[][20], char **bace, char *b) {Node stack1;char *point;char e, g;int k, i, a = 0, found = 0;initstack(&stack1,&point);g = getchar();while(g != '\n') {if(g == ')')break;if(g >= 'A' && g <= 'Z') {k = strlen(array[g - 'A']);if(found == 0){*(top++) = array[g - 'A'][0];found = 1;}for(i=0 ;i<k; i++)push(&stack1,&array[g - 'A'][i],&point);} else {if(g == '('){fun(&stack1, top, array, &point, &g);break;} else if(g != ')') {if(found == 0){*(top++) = g;found = 1;}push(&stack1, &g, &point);}}g = getchar();}top--;while(stack1.bace != stack1.top) {push(stack, top, bace);pop(&stack1, &e);push(stack, &e, bace);}pop(stack, &e);free(stack1.bace);return 0;}六、技巧与体会通过这次试验,我对有关栈和队列的知识更加熟悉、为后面所学的知识奠定了良好的基础、同时也使自己有了编程的技巧!以后要加强动手时间能力、多与同学交流算法精髓!在编写程序中尽量做到独立完成、对于自己想要完成的问题要主动编程完成、这样自己是一个很大的提升、也能学到很多的知识、熟练编程!。
魔王语言 实验报告
魔王语言实验报告1. 实验目的本实验旨在探索一种被称为魔王语言的语言现象,并对其进行分析和研究。
2. 实验背景在语言学领域,存在着一种被称为魔王语言的现象。
这种语言以其难以理解和识别的特点而闻名,有时甚至被称为“恶魔之语”。
许多人尝试了解和研究这种语言,希望能揭示其背后的奥秘。
3. 实验过程为了深入了解魔王语言,我们采用了以下步骤进行实验:步骤1:魔王语言文本收集我们首先搜集了大量的魔王语言文本样本。
这些文本来自不同的来源,包括魔王信函、魔法咒语书籍和神秘的古代文献。
我们收集的文本涵盖了不同的主题和语境,以便全面分析魔王语言。
步骤2:文本分析在这一步骤中,我们对收集到的文本进行了详细的分析。
我们注意到魔王语言的特点主要体现在以下几个方面:•字符替换:魔王语言中的字符常常被替换为其他字符,这使得文本变得难以辨认。
例如,字母“A”可能被替换为“@”,字母“E”可能被替换为“3”等等。
•语法变异:魔王语言的语法规则与传统语言不同,存在着一定的变异。
例如,动词可能在句子中出现的位置不同,或者名词和形容词的顺序可能被颠倒。
•隐藏信息:魔王语言中可能隐藏着某种特殊的信息。
这些信息可能需要特定的解密方法才能被识别出来。
步骤3:解码尝试为了解码魔王语言,我们进行了多次尝试。
我们试图根据魔王语言中的规律和特点,找到可能的解码方法。
我们使用了计算机程序进行自动化解码,同时也进行了手动解码实验。
然而,我们未能完全成功地解码魔王语言。
步骤4:结论尽管我们未能完全解码魔王语言,但我们对其进行了深入的分析和研究。
我们发现魔王语言是一种极具挑战性的语言现象,其独特的特点使其难以被理解和解码。
我们相信,进一步的研究和实验将有助于我们更好地理解魔王语言,并揭示其隐藏的奥秘。
4. 实验展望魔王语言作为一种神秘而难以理解的语言现象,仍然有许多待解决的问题。
未来的研究可以从以下几个方面展开:•更多文本样本的收集:收集更多的魔王语言文本样本,以便进行更全面和深入的分析。
魔王语言
西安郵電學院数据结构课程设计报告题目:魔王语言系部名称:通信与信息工程学院专业名称:通信工程班级:通工0905学号:03091183学生姓名:李辉指导教师:王小银时间:2010年11月15日至2010年11月24日一.实验目的(1)通过实验加深对线性表、栈、队列的掌握和应用。
(2)通过实验提高自己整合所学C语言及数据结构知识分析和解决实际问题的能力。
(3)进一步提高自己的编程水平。
二.实验内容及思想(1)问题描述:有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂。
但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α→β1β2 ……βm(2)(θδ1δ2 ……δn)→θδnθδn-1 ……θδ1 θ在这两种形式中,从左到右均表示解释;从右到左均表示抽象。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
(2)算法思想:算法主思想:①判断魔王语言大写转换成小写、小写转换成人类语言的规则是否存在,若存在则直接读出并保存在相应的单链表中,若不存在则予以创建并保存在对应的文件中。
②将输入的魔王语言存入字符数组,并逆序入栈利用递归的方法进行去括号操作。
③采用递归法对去完括号后的字符序列进行大写化小写操作。
④将经过③处理后得的小写字母序列利用字符串比较、插入等方法转换成人类语言,并把小写字母序列和翻译后的人类语言保存在result.txt文件中。
去括号思想:定义字符变量temp, 定义flag=0,当flag=1时进行递归。
采用while循环把输入的魔王语言从右自左依次逆序入栈s,当栈s不为空且没遇到右括号时依次出栈s,进栈s1,当遇到右括号时flag=1。
采用while循环元素出栈s1入队q直到遇到左括号,入队结束(左括号不入队),此时temp为左括号后的元素。
然后,当队q不为空时依次出队,令temp和出队元素依次入队s1,将多入队的元素删除一个。
魔王语言试验报告
试验报告:2.2 魔王语言解释一、需求分析(1)(2)字母替换中,可以存在魔王语言的字母,但最终要翻译成全部是小写字母。
(3)程序所能达到的功能:有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成为人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:①α->β1β2...βn②(θδ1δ2...δn)->θδnθδn-1...θδ1θ在这两种形式中,从左到右均表示解释。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂得话。
(4)基本要求:用下述两条具体规则和上述规则形式(2)实现。
设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。
魔王语言可含人的词汇。
① B->tAdA②A->sae二、概要设计:设计思想(1)存储结构根据问题描述,可采用堆栈结构。
结点描述:定义如下:typedef struct{char c[1000];int top;}SeqStack;(2)基本思想a.建立一个规则的结构体,其中一个char型存储某个字母的转换规则,一个int 型存储某个字母的转换规则的长度。
b.输入魔王语言后,再输入出现的要翻译的字母的规则,然后按转换格式进行转换,输出。
设计表示法(1)过程或函数调用的关系图mainStackInitiateStackPushStackPopprint1(2)基于数据结构的操作组本次实习题目比较简单,只用到一个堆栈,函数StackInitiate(),StackPush(),StackPop()都是堆栈的基本操作,函数print1()就是一个按照规则输出。
(3)过程与接口规格说明void StackInitiate(SeqStack *S)//建立栈void StackPush(SeqStack *S,char a)//入栈void StackPop(SeqStack *S,char *a)//出栈void print1(char a)//按规则输出实现注释(1)根据输入的魔王语言格式进行相应的数据处理。
数据结构实验报告(实验)
数据结构实验报告(实验)数据结构实验报告(实验)1. 实验目的1.1 理解数据结构的基本概念和操作1.2 学会使用数据结构解决实际问题1.3 掌握常用数据结构的实现和应用2. 实验环境2.1 操作系统:Windows 102.2 编程语言:C++2.3 开发工具:Visual Studio3. 实验内容3.1 实验一:线性表的实现和应用3.1.1 设计并实现线性表的基本操作函数3.1.2 实现线性表的插入、删除、查找等功能 3.1.3 实现线性表的排序算法3.1.4 应用线性表解决实际问题3.2 实验二:栈和队列的实现和应用3.2.1 设计并实现栈的基本操作函数3.2.2 设计并实现队列的基本操作函数3.2.3 实现栈和队列的应用场景3.2.4 比较栈和队列的优缺点3.3 实验三:树的实现和应用3.3.1 设计并实现二叉树的基本操作函数3.3.2 实现二叉树的创建、遍历和查找等功能3.3.3 实现树的遍历算法(前序、中序、后序遍历)3.3.4 应用树解决实际问题4. 数据结构实验结果4.1 实验一的结果4.1.1 线性表的基本操作函数实现情况4.1.2 线性表的插入、删除、查找功能测试结果4.1.3 线性表的排序算法测试结果4.1.4 线性表解决实际问题的应用效果4.2 实验二的结果4.2.1 栈的基本操作函数实现情况4.2.2 队列的基本操作函数实现情况4.2.3 栈和队列的应用场景测试结果4.2.4 栈和队列优缺点的比较结果4.3 实验三的结果4.3.1 二叉树的基本操作函数实现情况4.3.2 二叉树的创建、遍历和查找功能测试结果 4.3.3 树的遍历算法测试结果4.3.4 树解决实际问题的应用效果5. 实验分析与总结5.1 实验问题与解决方案5.2 实验结果分析5.3 实验总结与心得体会6. 附件附件一:实验源代码附件二:实验数据7. 法律名词及注释7.1 版权:著作权法规定的对原创作品享有的权利7.2 专利:国家授予的在一定时间内对新型发明享有独占权利的证书7.3 商标:作为标识企业商品和服务来源的标志的名称、符号、图案等7.4 许可协议:指允许他人在一定条件下使用自己的知识产权的协议。
魔王语言 数据结构试验报告
魔王语言系统解释一、需求分析[问题描述]有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的懂。
但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α->β1β2...βn(2)(θδ1δ2...δn)->θδnθδn-1...θδ1θ在这两种形式中,从左到右均表示解释;从右到左表示抽象。
试写一个魔王解释系统,把他的话解释成人能听懂得话。
[基本要求]用下述两条具体规则和上述规则形式(2)实现。
设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母(a,b1,s,y1等)表示可以用大写或小写字母代换的变量。
魔王语言可含人的词汇。
(1)B->tAdA(2) A->sae[测试数据]B(einxgz)B解释成 tsaedsaeezegexeneietsaedsae若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一个鹅地上一个鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一个鹅地上一个鹅。
”t d s a e z G x n i天地上一个鹅追赶下蛋恨[实现提示]将魔王的语言自右至左进栈,总是处理栈顶。
若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。
其他情形较简单,请读者思考如何处理,应首先实现栈和队列的基本运算二、概要设计为实现上述程序功能,应以栈和队列来表示。
1.设定栈的抽象数据类型定义为:ADT Stack{数据对象:D={ai | ai∈CharSet,I=1,2,......,n,n≥0}数据关系:R1={< ai-1,ai > |ai-1,ai∈D,I=1,2,......,n}基本操作:ListInitiate (&S)操作结果:构造一个空栈S。
StackEmpty(S)初始条件:栈S已经存在。
操作结果:若栈S为空栈,则返回TRUE,否则返回FALSE。
魔王语言实验报告
魔王语言实验报告-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN数据结构实验报告(魔王语言)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)魔王语言的解释规则:大写字母表示魔王语言的词汇,小写字母表示人的词汇语言,魔王语言中可以包含括号,魔王语言的产生式规则在程序中给定,当接收用户输入的合法的魔王语言时,通过调用魔王语言翻译函数来实现翻译。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)抽象数据类型:typedef struct{StackElementType elem[Stack_Size];int top;}SeqStack;主程序模块:int main(){GhostLanage();printf("\n\t按任意键退出\n\n");}各子程序模块:/*初始化栈*/void InitStack(SeqStack *s){s->top=-1;}/*进栈操作*/void Push(SeqStack *s,StackElementType x){if(s->top==Stack_Size-1)printf("\n\t栈已满! ");else {s->top++;s->elem[s->top]=x;}}/*出栈操作*/void Pop(SeqStack *s,StackElementType *x){if(s->top==-1)printf("\n\t栈为空! ");else {*x=s->elem[s->top];s->top--;}}/*取栈顶元素*/void GetTop(SeqStack *s,StackElementType *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 GhostLanage(){SeqStack B,A,s,B1,A1,r,M;StackElementType ch,ch1,ch2,x;char aa[100];int choice,i=0,n;InitStack(&B);InitStack(&A);InitStack(&s);InitStack(&r);InitStack(&M);printf("魔王语言的转换形式: B->tAdA A->sae");Push(&B,'t');Push(&B,'A');Push(&B,'d');Push(&B,'A');Push(&A,'s');Push(&A,'a');Push(&A,'e');printf("\n请输入要翻译的魔王语言:\n");scanf("%s",aa);for(i=0;aa[i]!='\0';i++)Push(&s,aa[i]);while(IsEmpty(&s)){Pop(&s,&ch);if(ch=='B'){B1=B;while(IsEmpty(&B1)){Pop(&B1,&ch1);if(ch1=='A'){A1=A;while(IsEmpty(&A1)) {Pop(&A1,&ch2); Push(&r,ch2); }}else Push(&r,ch1);}}else if(ch=='A'){A1=A;while(IsEmpty(&A1)) {Pop(&A1,&ch2); Push(&r,ch2); }}else if(ch==')'){Pop(&s,&ch2);while(ch2!='('){Push(&M,ch2);Pop(&s,&ch2);}GetTop(&M,&ch2);x=ch2;Pop(&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-不继续)"); 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 ;}三、【实现描述(Implement)】(30%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
魔王语言系统解释一、需求分析[问题描述]有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的懂。
但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α->β1β2...βn(2)(θδ1δ2...δn)->θδnθδn-1...θδ1θ在这两种形式中,从左到右均表示解释;从右到左表示抽象。
试写一个魔王解释系统,把他的话解释成人能听懂得话。
[基本要求]用下述两条具体规则和上述规则形式(2)实现。
设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母(a,b1,s,y1等)表示可以用大写或小写字母代换的变量。
魔王语言可含人的词汇。
(1)B->tAdA(2) A->sae[测试数据]B(einxgz)B解释成 tsaedsaeezegexeneietsaedsae若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一个鹅地上一个鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一个鹅地上一个鹅。
”t d s a e z G x n i天地上一个鹅追赶下蛋恨[实现提示]将魔王的语言自右至左进栈,总是处理栈顶。
若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。
其他情形较简单,请读者思考如何处理,应首先实现栈和队列的基本运算二、概要设计为实现上述程序功能,应以栈和队列来表示。
1.设定栈的抽象数据类型定义为:ADT Stack{数据对象:D={ai | ai∈CharSet,I=1,2,......,n,n≥0}数据关系:R1={< ai-1,ai > |ai-1,ai∈D,I=1,2,......,n}基本操作:ListInitiate (&S)操作结果:构造一个空栈S。
StackEmpty(S)初始条件:栈S已经存在。
操作结果:若栈S为空栈,则返回TRUE,否则返回FALSE。
Push(&S,e)初始条件:栈S已经存在。
操作结果:在栈S的栈顶插入新的栈顶元素e。
Pop(&S,&e)初始条件:栈S已经存在。
操作结果:删除S的栈顶元素,并以e返回其值。
} ADT Stack2. 设定队列的抽象数据类型定义为:ADTQueue{数据对象:D={ai | ai∈ElemSet,I=1,2,......,n,n≥0}数据关系:R1={< ai-1,ai > |ai-1,ai∈D,I=1,2,......,n}基本操作:ListInitiate (&Q)操作结果:构造一个空队列Q。
StackEmpty(Q)初始条件:队列Q已经存在。
操作结果:若队列Q为空栈,则返回TRUE,否则返回FALSE。
EnQueue(&Q,e)初始条件:队列Q已经存在。
操作结果:插入元素e为Q的新的队尾元素。
DeQueue(&Q,&e)初始条件:队列Q已经存在。
操作结果:删除Q的对头元素,并以e返回其值。
} ADT Queue2.程序包含四个模块:1)主程序模块:Void main(){初始化;For(){接受处理命令;}接受处理;}2)栈模块——实现栈的抽象数据类型;3)队列模块——实现队列的抽象数据类型。
4)魔王语言解释模块——定义线性表的结点结构。
各模块的之间的调用关系如下:主程序模块魔王语言解释模块栈模块队列模块三、详细设计1. 栈类型struct Stack{char* base;char* top;int stacksize;};2. 队列类型struct Stack{char* base;char* top;int stacksize;};struct LinkQueue{struct Queue* front;struct Queue* rear;};3.栈的基本操作//构造栈void InitStack(struct Stack &s){s.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char)); s.top=s.base;s.stacksize=STACK_INIT_SIZE;}//往栈中压入元素void Push(struct Stack &s,char e){if(s.top-s.base>=STACK_INIT_SIZE){s.base=(char*)realloc(s.base,(s.stacksize+STACK_INCREMENT)*sizeof(char)); s.top=s.base+s.stacksize;s.stacksize+=STACK_INCREMENT;}*(s.top)=e;s.top++;}//取出栈中的元素void Pop(struct Stack &s,char &e){e=*--s.top;}//判断栈是否为空int StackEmpty(struct Stack s){if(s.top==s.base) return 1;else return 0;}//清空栈void ClearStack(struct Stack &s){s.top=s.base;}4队列的基本操作//构造队列void InitQueue(struct LinkQueue &q){q.front=q.rear=(struct Queue*)malloc(sizeof(struct Queue));q.front->next=NULL;}//元素入队void EnQueue(struct LinkQueue &q,char e){struct Queue* p;p=(struct Queue*)malloc(sizeof(struct Queue));p->data=e;p->next=NULL;q.rear->next=p;q.rear=p;}//元素出队void DeQueue(struct LinkQueue &q,char &e) {struct Queue* 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(struct LinkQueue q) {if(q.front==q.rear) return 1;else return 0;}//把字符数组从右至左压入栈中void InStack(char* ch,struct Stack &s){int i,L=0;while(ch[L]!='\0') L++;for(i=L-1;i>=0;i--) Push(s,ch[i]);}4.主函数和其他函数的算法(含注释):#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 100#define STACK_INCREMENT 10int main(){printf("**************************************************************\n");printf("* **************************** *\n");printf("* * 魔王语言解释系统* *\n");printf("* **************************** *\n");printf("* 班级:物联网工程1001班*\n");printf("* 姓名: ******** *\n");printf("* 学号: 0909100818 *\n");printf("**************************************************************\n\n");int xunhuan=1;printf("请输入你想要解释的魔王语言:\n");while (xunhuan==1) //一个总循环控制整个程序的重复进行{char A[]="sae"; //大写字母作为字符数组名存放小写字母char B[]="tsaedsae";char flag='0'; //flag用来标记处理括号char e1,key,e2,e;int mark=1; //标记输入的魔王语言是否在允许的范围之内int f=1; // 判断括号是否匹配char MoWang[100]="\0"; //定义一个魔王变量,存放待解释的语言字符struct Stack S; //作为栈存储元素,为后续操作和输出做准备struct Stack temp; //用来处理括号外的元素InitStack(S);InitStack(temp);struct LinkQueue Q;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==')'){f=1;break;}else if(!(e1>='a'&&e1<='z')&&!(e1>='A'&&e1<='Z')){printf("魔王语言错误!\n");mark=0;break;}}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");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); //有括号的话就用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); //把括号外的元素压入中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);else 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("一只"); 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);}return 0;}四、调试分析1.函数调用。