1、dsaezgxnh天地上一只鹅追赶下蛋恨测试数据 B(einxgz)B解释成tsaedsaeezegexeneietsaedsae 若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一个鹅地上一个鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一个鹅地上一个鹅。” 实现提示 将魔王的语言自右至左进栈,总是处理栈顶。若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。其他情形较简单,请读者 思考如何处理,应首先实现栈和队列的基本运算二、概要设计 为实现上述程序功能,应以栈和队列来表示。1.设定栈的抽象数据类型定义为:ADT Stack 数据对象:D=ai | a
2、iCharSet,I=1,2,.,n,n0 数据关系:R1= |ai-1,aiD,I=1,2,.,n 基本操作: ListInitiate (&S) 操作结果:构造一个空栈S。StackEmpty(S) 初始条件:栈S已经存在。若栈S为空栈,则返回TRUE,否则返回FALSE。Push(&S,e)在栈S的栈顶插入新的栈顶元素e。Pop(&S,&e)删除S的栈顶元素,并以e返回其值。 ADT Stack2. 设定队列的抽象数据类型定义为:ADTQueue D=ai | aiElemSet,I=1,2,.,n,n0 ListInitiate (&Q) 构造一个空队列Q。StackEmpty(Q)队
3、列Q已经存在。若队列Q为空栈,则返回TRUE,否则返回FALSE。EnQueue(&Q,e)插入元素e为Q的新的队尾元素。DeQueue(&Q,&删除Q的对头元素,并以e返回其值。 ADT Queue程序包含四个模块:1) 主程序模块:Void main()初始化;For()接受处理命令;接受处理;2) 栈模块实现栈的抽象数据类型;3) 队列模块实现队列的抽象数据类型。4) 魔王语言解释模块定义线性表的结点结构。各模块的之间的调用关系如下: 主程序模块 魔王语言解释模块 栈模块队列模块三、详细设计1. 栈类型struct Stack char* base; char* top; int sta
4、cksize;2. 队列类型struct Stackstruct 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.bas
5、e=(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(struc
6、t Stack &s) 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; q.rear-next=p; q.rear=p;/元素出队void DeQueue(s
7、truct LinkQueue &q,char &e) p=q.front-next; e=p-data;next=p- if(q.rear=p) q.rear=q.front; free(p);/判断队列是否为空,如果对为空,返回,否则返回int QueueEmpty(struct LinkQueue q) if(q.front=q.rear) return 1;/把字符数组从右至左压入栈中void InStack(char* ch,struct Stack & int i,L=0; while(chL!=0) L+; for(i=L-1;i=0;i-) Push(s,chi); 4.主函数
8、和其他函数的算法(含注释):#includestdlib.h#define STACK_INIT_SIZE 100#define STACK_INCREMENT 10int main() printf(*n);* *n* 魔王语言解释系统 * *n* 班级:统计2011级 *n* 姓名: 陈枫 *n* 学号: 201101051304 *n*nn int xunhuan=1; printf(请输入你想要解释的魔王语言:n while (xunhuan=1) /一个总循环控制整个程序的重复进行 char A=sae; /大写字母作为字符数组名存放小写字母 char B=tsaedsae char
9、 flag=0 /flag用来标记处理括号 char e1,key,e2,e; int mark=1; /标记输入的魔王语言是否在允许的范围之内 int f=1; / 判断括号是否匹配 char MoWang100=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) 魔王语言错误! mark=0;f=0; break; StackEmpty(S) ) f=1; else if(!(e1a&e1z)&!AZ) 魔王语言错误! if(mark=0) if(f!=1) else if(e1=)if(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1