实验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<data<<"";
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,不再读入数据。