实验4栈与队列实验 续.docx
- 文档编号:26251581
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:15
- 大小:51.86KB
实验4栈与队列实验 续.docx
《实验4栈与队列实验 续.docx》由会员分享,可在线阅读,更多相关《实验4栈与队列实验 续.docx(15页珍藏版)》请在冰豆网上搜索。
实验4栈与队列实验续
实验4:
栈与队列实验续
学生姓名:
张皓然学号:
5501215001专业班级:
本硕151
一、实验目的:
(1)掌握链接存储队列的进队和出队等基本操作。
(2)掌握环行队列的进队和出队等基本操作。
(3)加深对队列结构的理解,逐步培养解决实际问题的编程能力。
二、链队列实验要求:
(1)编写链接队列的基本操作函数。
typedefstructQNode
{
intdata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;//队头指针
QueuePtrrear;//队尾指针
}LinkQueue;
①进队操作EnQueue(LinkQueue&Q,inte)
②出队操作,队空DeQueue(LinkQueue&Q,int&e)
③输出队列中元素0utputQueue(LinkQueueQ)
(2)调用上述函数实现下列操作,操作步骤如下。
①调用进队函数建立一个队列。
②读取队列中的第一个元素。
③从队列中删除元素。
④输出队列中的所有元素。
注意每完成一个步骤就必须及时输出队列中元素,以便观察操作结果。
三、链队列实现代码及注释:
//链接队列的实现
#include
#include
usingnamespacestd;
#defineERROR1
#defineOK0
#defineOVERFLOW-1
#defineMAXQSIZE100//最大队列长度
typedefstructQNode//结点
{
intdata;//数据域
QNode*next;//指针域
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;//队头指针
QueuePtrrear;//队尾指针
}LinkQueue;
intinitqueue(LinkQueue&q)//构造一个空队列并进行初始化
{
intm;
QNode*p;
q.front=q.rear=(QNode*)malloc(sizeof(QNode));//申请头结点
if(!
q.front)
exit(OVERFLOW);//存储空间分配失败
q.front->next=NULL;//空队列
cout<<"初始化队列:
(0代表结束)"< while(scanf("%d",&m)! =EOF&&m! =0){//输入0的时候代表输入结束 p=(QNode*)malloc(sizeof(QNode)); p->data=m;//m为数据值 q.rear->next=p;//队尾的指针域指向p p->next=NULL;//p的指针域为空 q.rear=p;//队尾指针后移 } returnOK; } intgethead(LinkQueueq) {//用e返回队头的值 inte; if(q.front==q.rear){ cout<<"队列为空! \n"; returnERROR;//队列空 } e=q.front->next->data;//第一个节点为头结点,所以需要next cout<<"队头的值为: "< returnOK; } intenqueue(LinkQueue&q) {//插入元素e为新的队尾元素 inte; QNode*p; p=(QNode*)malloc(sizeof(QNode)); if(! p)exit(OVERFLOW); cout<<"请输入插入队尾的数: "; cin>>e; p->data=e;//p的数据域为e p->next=NULL;//p的next为空 q.rear->next=p;//队尾的指针域指向新的结点 q.rear=p;//队尾指针后移 returnOK; } intdequeue(LinkQueue&q) {//删除队头元素,并用e返回所删除的值 inte; if(q.front==q.rear){ cout<<"删除失败\n"; returnERROR;//队列空,无法删除 } QNode*p; p=q.front->next;//p指向第一个元素 e=p->data;//e取得第一个元素的值 q.front->next=p->next;//头结点指向第二个元素 if(q.rear==p)q.rear=q.front; //这种情况是只有一个元素的情况,被删除后队尾指针指向的地方没有意义,需要等于队头指针 free(p);//释放p的空间 cout<<"删除成功! 被删除队头的值为: "< returnOK; } intshowqueue(LinkQueue&q) {//遍历队列元素 QNode*p; if(q.front==q.rear){ cout<<"队列为空! \n"; returnERROR;//队列空 } p=q.front->next; cout<<"队列里的值为: "; while(p! =NULL){ cout< p=p->next; } cout< returnOK; } voidmenu()//菜单 { cout<<"**********************************\n"; cout<<"*链队列基本操作*\n"; cout<<"**********************************\n"; cout<<"*1.输出队头的值*\n"; cout<<"*2.向队尾插入新元素*\n"; cout<<"*3.删除队头*\n"; cout<<"*4.遍历队列*\n"; cout<<"*5.初始化队列*\n"; cout<<"*0.退出*\n"; cout<<"**********************************\n"; cout<<"请输入要选择的选项(0-5): \n"; } intmain() { intk=1; LinkQueueq; menu(); while(k){//循环操作 cout<<"请选择操作: "; cin>>k; switch(k){ case0: break; case1: gethead(q);showqueue(q);break; case2: enqueue(q);showqueue(q);break; case3: dequeue(q);showqueue(q);break; case4: showqueue(q);break; case5: initqueue(q);showqueue(q);break; default: cout<<"error! \n";break;//默认选项 } } return0; } 四、链队列测试结果: 建立一个队列的功能 1.输入的形式和输入值的范围: 输入若干正整数,用空格分隔,用0来表示结束。 2.输出的形式: 按输入顺序输出。 3.测试数据: 输入523690后,输出52369 (2)取队头元素功能 1.取出队头元素是: 5 2.输出队列元素是: 52369 (3)删除队头元素功能 1.删除队列数据元素是: 5 2.输出队列元素是: 2369 (4)输出队列所有元素功能 输出队列所有元素是: 2369 (5)结束功能 输入0结束程序! 五、循环队列实验要求: 编写环型队列的基本操作函数。 #defineMAXSIZE100//最大队列长度,最多只能插入MAXSIZE-1个数据 typedefstruct { int*base;//初始化的动态分配存储空间 intfront;//头指针,若队列不为空,指向队列头元素 intrear;//为指针,若队列不为空,指向队列尾元素的下一个位置 }SqQueue; ①进队操作,返回1为队满EnQueue(SqQueue&Q,inte) ②出队操作,返回1为队空DeQueue(SqQueue&Q,int&e) ③输出队列中元素OutputQueue(SqQueue&Q) (4)调用上述函数实现下列操作,操作步骤如下: ①调用进队函数建立一个队列。 ②读取队列中的第一个元素。 ③从队列中删除元素。 ④输出队列中的所有元素。 注意每完成一个步骤就必须及时输出队列中元素,以便观察操作结果。 六、循环队列实现代码及注释 #include #include usingnamespacestd; //符号定义 #defineERROR1 #defineOK0 #defineOVERFLOW-1 #defineMAXQSIZE100//最大队列长度 typedefstruct { int*base;//初始化的动态分配存储空间基地址 intfront;//头指针,若队列不空,指向队列头元素 intrear;//尾指针,若队列不空,指向队列尾元素的下一个位置 }sqqueue; intinitsqqueue(sqqueue&q)//构造一个空队列并进行初始化 { intm; q.base=(int*)malloc(MAXQSIZE*sizeof(int)); if(! q.base)exit(OVERFLOW);//存储空间分配失败 q.front=q.rear=0; while(scanf("%d",&m)! =EOF&&m! =0){ q.base[q.rear]=m; q.rear++; } returnOK; } intgetsqhead(sqqueueq) { inte; if(q.rear==q.front){ cout<<"队列为空! \n"; returnERROR;//队列空 } e=q.base[q.front]; cout<<"队头的值为"< returnOK; } intensqqueue(sqqueue&q)//插入元素e为新的队尾元素 { if((q.rear+1)%MAXQSIZE==q.front){ cout<<"队列满! \n"; returnERROR;//队列满 } inte; cout<<"请输入插入队尾的数: "; cin>>e; q.base[q.rear]=e;//插入e q.rear=(q.rear+1)%MAXQSIZE;//新的队尾 returnOK; } intdesqqueue(sqqueue&q) {//删除队头元素 if(q.rear==q.front){ cout<<"删除失败\n"; return-1; }//队列空 inte; e=q.base[q.front]; cout<<"删除成功! 所删除的队头的值为: "< q.front=(q.front+1)%MAXQSIZE;//指针后移 returnOK; } intshowsqqueue(sqqueueq) {//遍历队列元素 intn; n=q.front; if(q.front==q.rear){ cout<<"队列为空! \n"; return-1; } cout<<"队列里的值为: "; while(n! =q.rear) { cout< n=(n+1)%MAXQSIZE; } cout< returnOK; } voidmenu()//菜单 { cout<<"**********************************\n"; cout<<"*循环队列测试*\n"; cout<<"**********************************\n"; cout<<"*1.输出队头的值*\n"; cout<<"*2.向队尾插入新元素*\n"; cout<<"*3.删除队头*\n"; cout<<"*4.遍历队列*\n"; cout<<"*5.初始化队列*\n"; cout<<"*0.退出*\n"; cout<<"**********************************\n"; cout<<"请输入要选择的选项(0-5): \n"; } intmain() { intk=1; sqqueueq; menu(); while(k){//循环操作 cout<<"请选择操作: "; cin>>k; switch(k){ case0: break; case1: getsqhead(q);showsqqueue(q);break; case2: ensqqueue(q);showsqqueue(q);break; case3: desqqueue(q);showsqqueue(q);break; case4: showsqqueue(q);break; case5: initsqqueue(q);showsqqueue(q);break; default: cout<<"error! \n";break;//默认选项 } } return0; } 七、循环队列实验调试结果: //环型队列 (1)初始化队列 (2)建立一个队列的功能 1.输入的形式和输入值的范围: 输入若干正整数,用空格分隔,用0来表示结束。 2.输出的形式: 按输入顺序输出。 3.测试数据: 输入11121314150后,输出1112131415 (3)取队头元素功能 1.取出队头元素是: 11 2.输出队列元素是: 1112131415 (4)删除队头元素功能 1.删除队列数据元素是: 11 2.输出队列元素是: 12131415 (5)输出队列所有元素功能 输出队列所有元素是: 12131415 (6)进队功能 1.输入进队的元素: 16 2.输出所有的 (7)结束功能 输入0结束程序! 8、实验体会 在初始化队列中,要求的是用0代表输入的结束,可以用while循环来判断输入是否终止。 while(scanf("%d",&m)! =EOF&&m! =0){ q.base[q.rear]=m; q.rear++; } 当m等于0时,判断条件为false,不再读入数据。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验4栈与队列实验 实验 队列
![提示](https://static.bdocx.com/images/bang_tan.gif)