1、nh天地上一只鹅追赶下蛋恨4实现提示 将魔王的语言自右至左进栈,总是处理栈顶字符。若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列在处理后入栈。5.本程序采用的是顺序栈。基本操作列表:(1)据括号的个数设一个标记。记下括号的位置。(2)根据标记来执行依次的操作。(3)没有括号,直接进队,据翻译函数2输出人的语言。(4)有括号,分为括号的和括号外的。,根据括号的位置:括号外的从右到左入栈;括号的从左到右入栈,并且依次插入括号的第一个字符。据翻译函数2 出栈并且翻译。二、需求分析1. 本演示程序中,魔王语言限制在小写字母a-z之间,且必须限制在括号以及大写字母A和B
2、。且允许出现重复字符或非法字符,程序运用时自动过滤去,输出的运算结果中将不含重复字符和非法字符。2. 魔王语言遵守如下规则: (123n)nn-11BtAdA Asae 3. 演示程序以用户和计算机对话的形式进行,即在计算机终端中显示提示信息之后,有用户自行选择下一步命令,相应输入数据和运算结果在其后显示。4. 程序的执行命令有:1)选择操作 2)任意键结束5. 数据测试 B(ehnxgz)B解释成:tsaedsaeezegexenehetsaedsae若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:三、概要设计为实现上述功能,需要栈和队列两个抽象数据类型。1. 栈抽象数据类型定义A
3、DT stack数据对象:D=ai|aiElemset,i=1,2,3,n,n=0数据关系:R1=|ai-1,aiD,i=2, n基本操作:InitStack(&s)操作结果:构造一个空栈s。Push(&s, e)初始条件:栈s已存在。插入元素e为新的栈顶元素。Pop(&s, &e)栈s已存在且非空。删除栈s的栈顶元素,并用e返回其值。StackLenth(&返回s的元素个数,即栈的长度。ClearStack(&将s清为空栈。DestoryStack(&栈s被销毁。StackEmpty(&若是为空栈,则返回TRUE,否则返回FALSE。Traverse(&s,void(*visit)()依次遍
4、历栈s中的元素,依次调用函数,一旦失败,则操作失败。ADT stack2. 队列抽象数据类型定义ADT QueueInitQueue(&q)构造一个空队列Q。EnQueue(&q, e)队列Q已存在。插入元素e为Q的新的队尾元素。QueueLenth(&队列已存在。返回Q的元素个数,即队列的长度。DeQueue(&q, &删除Q的队尾元素,并用e返回其值。QueueEmpty(&若Q为空队列,则返回TRUE,否则返回FALSE.ClearQueue(&清空队列Q。DestoryQueue(&队列Q被销毁。不再存在。QueueTraverse(&q,Status(*visit)()依次遍历队列Q
5、的元素,依次调用函数,一旦失败,则操作失败。ADT Queue流程图如下:本程序主要包括以下几个模块:主程序模块: int main()GhostLanage();printf(nt按任意键退出nn);各子程序模块: /*初始化栈*/void InitStack(SeqStack *s)s-top=-1;/*进栈操作*/void Push(SeqStack *s,StackElementType x)if(s-top=Stack_Size-1) printf(nt栈已满! else s-top+;s-elems-top=x;/*出栈操作*/void Pop(SeqStack *s,StackE
6、lementType *x)top=-1)nt栈为空!else *x=s-top;top-;/*取栈顶元素*/void GetTop(SeqStack *s,StackElementType *x)else *x=s-/*判断栈是否为空*/int IsEmpty(SeqStack *s)top=-1) return(0);else return(1);/*魔王语言翻译函数*/void GhostLanage()SeqStack B,A,s,B1,A1,r,M;StackElementType ch,ch1,ch2,x;char aa100;int choice,i=0,n;B);A);s);r
7、);M);魔王语言的转换形式: B-tAdA A-saeB,tAdA,saen请输入要翻译的魔王语言:nscanf(%s,aa);for(i=0;aai!=0;i+)s,aai);while(IsEmpty(&s)Pop(&s,&ch); if(ch=B) B1=B; while(IsEmpty(&B1) Pop(&B1,&ch1); if(ch1= A1=A;A1)A1,&ch2); Push(&r,ch2); else Push(&r,ch1); else if(ch=) while(ch2!( Push(&M,ch2); Pop(& GetTop(&M,& x=ch2;M)r,x);r,
8、ch);M=r;nnt翻译的结果为:%c,ch);nnt是否继续翻译为汉语:( 1-继续,0-不继续)%d,&n);if(n=1) printf(nnt翻译为汉语的结果为: nnt M=r;) printf(天地上一只鹅z追g赶x下n蛋h恨else ;模块间的关系是:主程序翻译函数1翻译函数2栈模块 四、详细设计本程序中的主要函数有:void InitStack(SeqStack *s);/*初始化栈*/void Push(SeqStack *s,StackElementType x); /*进栈操作*/void Pop(SeqStack *s,StackElementType *x);void GetTop(SeqStack *s,StackElementType *x);int IsEmpty(SeqStack *s);void GhostLanage();函数间的调用关系:主程序调用魔王语言翻译函数,然后魔王语言翻译函数调用其它的函数(初始化栈,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1