1、数据结构实验两个栈模拟队列数据结构实验报告实验题目: 利用两个顺序栈模拟一个队列实验目的:熟悉顺序栈和队列的建立以及遍历,并且了解两者之间的区别与联系。实验内容:利用两个顺序栈,一个栈模拟入队,一个栈模拟出队,实现两个栈模拟队的操作。一、需求分析1.本程序中首先设定队的大小为20,以便判断队满,首先应输入入队元素个数,然后输入入队元素,后根据提示入队或出队,如入队,重复上述过程,如出队,输入出队元素个数,然后程序会显示出队元素,可以重复上述过程,直到输入结束为止。2.演示程序以用户和计算机的对话方式执行,可以按照计算机程序显示提示进行操作。3.程序执行命令包括:(1)构造栈(2)初始化栈(3)
2、选择输入方式既入队或是出队,如是入队,先输入需要入队元素个数,再输入元素,如要出队,输入要输出元素个数,则可直接显示出队元素,可重复上述过程(4)结束4.测试数据(1)入队元素个数5,分别为1 2 3 4 5,然后出队元素个数为3个,结果为1 2 3(2)再入队5个,分别为6 7 8 9 10,再出队6个4 5 6 7 8 9(3)再出队3个,分别为10 队空(4)入队元素个数25个,分别为1-25,在输入21时显示队满。二 概要设计为实现上述操作,应以两个栈为存储结构1. 基本操作:void initstack(seqstack &s) 操作结果:实现栈的初始化void inqueue(se
3、qstack &s1,seqstack &s2) 操作结果:实现入队功能void outqueue(seqstack &s1,seqstack &s2)操作结果:实现出队功能2. 本程序包含四个模块(1) 主程序模块(2) 栈初始化模块】(3) 入队模块(4) 出队模块3. 模块调用图 三 详细设计1. 元素类型,节点类型和指针类型typedef int elemtype;typedef struct elemtype datamaxsize; int top;seqstack;seqstack s1,s2;2. 每个模块的分析(1) 主程序模块int main() int k,m,selec
4、t,num; seqstack s1,s2; initstack(s1); /*初始化栈s1*/ initstack(s2); /*初始化栈s2*/ while(select!=3) /*选择操作*/ printf(请选择操作:n); printf(1.入队n2.出队n3.结束n); scanf(%d,&select); switch(select) case 1: inqueue(s1,s2); /*入队操作*/ break; case 2: printf(请输入出队元素个数:n); /*输入出队元素个数*/ scanf(%d,&num); for(k=0;knum;k+) /*利用循环输出
5、元素*/ if(s1.top=-1&s2.top=-1) /*判断队空*/ printf(队空.n); break; else /*如果不空,则出队*/ outqueue(s1,s2); break; case 3: break; getchar(); getchar(); return 0;(2) 栈初始化模块void initstack(seqstack &s) s.top=-1;(3) 入队模块void inqueue(seqstack &s1,seqstack &s2) int number,m,i; printf(请输入入队元素个数:n); scanf(%d,&number); /*
6、输入入队元素个数*/ for(i=0;inumber;i+) printf(请输入元素:); /*输入入队元素*/ scanf(%d,&m); if(s1.top=maxsize-1&s2.top!=-1) /*判断队满,即s1栈为满,s2栈不为空,此时对中不能再进元素*/ printf(队满.n); break; else /*如果队不满可以接着入队*/ if(s1.top!=maxsize-1) /*如果s1不满,接着入队,让元素进栈s1*/ s1.top+; s1.datas1.top=m; Else /*如果s2空,先让栈s1中元素进入栈s2,直到s1空,然后让元素进入s1*/ do
7、s2.top+; s2.datas2.top=s1.datas1.top; s1.top-; while(s1.top!=-1); s1.top+; s1.datas1.top=m; (4) 出队模块void outqueue(seqstack &s1,seqstack &s2) if(s2.top!=-1) /*如果栈s2不空,直接出栈,相当于出队*/ printf(元素%d出队,s2.datas2.top); s2.top-; else /*如果s2空,让s1中元素进s2,直到s1为空,然后再出栈*/ do s2.top+; s2.datas2.top=s1.datas1.top; s1.
8、top-; while(s1.top!=-1); printf(元素%d出队,s2.datas2.top); s2.top-; printf(n);(5)函数调用关系图int main()void initstack(seqstack &s)void inqueue(seqstack &s1,seqstack &s2)void outqueue(seqstack &s1,seqstack &s2)3完整的程序:(见源文件).四 使用说明、测试分析及结果1.程序使用说明(1)本程序的运行环境为VC6.0.(2)进入演示程序后即显示提示请选择操作1. 入队2. 出队3. 结束请输入入队元素个数请输
9、入元素请输入出队元素个数2.测试结果(1)入队元素个数5,分别为1 2 3 4 5,然后出队元素个数为3个,结果为1 2 3(2)再入队5个,分别为6 7 8 9 10,再出队6个4 5 6 7 8 9(3)再出队3个,分别为10 队空(4)入队元素个数25个,分别为1-25,在输入21时显示队满。3.调试中的错误刚开始编完运行入队正常,结果无法出队,经检查为在判断队满是s1.top=maxsize-1处少了一个=号,导致错误,改正后正常。4. 运行界面五、实验总结本次试验由于准备不足,实验课前未在纸上进行预编程,实验课上算法思想出现了一定的偏差,导致未能在课上编出程序,回来后经过仔细思考和同
10、学提示,将算法思想进行了改进,然后顺利编出程序,虽然中间出现了一点小问题,经过检查已解决。通过本次试验可以熟练掌握栈的使用。 教师评语:实验成绩:#include#define maxsize 10typedef int elemtype;/队容量最大为20个元素typedef struct elemtype datamaxsize; int top;seqstack;/初始化栈void initstack(seqstack &s) s.top=-1;/入队void inqueue(seqstack &s1,seqstack &s2) int number,m,i; printf(请输入入队元
11、素个数:n); scanf(%d,&number); /*输入入队元素个数*/ for(i=0;inumber;i+) printf(请输入元素:); /*输入入队元素*/ scanf(%d,&m); if(s1.top=maxsize-1&s2.top!=-1) /*判断队满,即s1栈为满,s2栈不为空,此时对中不能再进元素*/ printf(队满.n); break; else /*如果队不满可以接着入队*/ if(s1.top!=maxsize-1) /*如果s1不满,接着入队,让元素进栈s1*/ s1.top+; s1.datas1.top=m; else /*如果s2空,先让栈s1中
12、元素进入栈s2,直到s1空,然后让元素进入s1*/ do s2.top+; s2.datas2.top=s1.datas1.top; s1.top-; while(s1.top!=-1); s1.top+; s1.datas1.top=m; /出队void outqueue(seqstack &s1,seqstack &s2) if(s2.top!=-1) /*如果栈s2不空,直接出栈,相当于出队*/ printf(元素%d出队,s2.datas2.top); s2.top-; else /*如果s2空,让s1中元素进s2,直到s1为空,然后再出栈*/ do s2.top+; s2.datas
13、2.top=s1.datas1.top; s1.top-; while(s1.top!=-1); printf(元素%d出队,s2.datas2.top); s2.top-; printf(n);int main() int k,m,select,num; seqstack s1,s2; initstack(s1); /*初始化栈s1*/ initstack(s2); /*初始化栈s2*/ while(select!=3) /*选择操作*/ printf(请选择操作:n); printf(1.入队n2.出队n3.结束n); scanf(%d,&select); switch(select) case 1: inqueue(s1,s2); /*入队操作*/ break; case 2: printf(请输入出队元素个数:n); /*输入出队元素个数*/ scanf(%d,&num); for(k=0;knum;k+) /*利用循环输出元素*/ if(s1.top=-1&s2.top=-1) /*判断队空*/ printf(队空.n); break; else /*如果不空,则出队*/ outqueue(s1,s2); break; case 3: break; getchar(); getchar(); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1