试验循环队列的基本操作及应用.docx
《试验循环队列的基本操作及应用.docx》由会员分享,可在线阅读,更多相关《试验循环队列的基本操作及应用.docx(8页珍藏版)》请在冰豆网上搜索。
试验循环队列的基本操作及应用
数据构造实验报告
----试验三循环队列的根本操作及应用
一、问题描述:
熟悉并掌握循环队列的相关操作,自己设计程序,实现循环队列的构造、清空、销毁及队列元素的插入和删除等相关操作。
二、数据构造设计:
#defineMAXQSIZE10//最大队列长度
structSqQueue
{
QElemType*base;//初始化动态分配存储空间
Intfront;//头指针,假设队列不空,只想对列头元素
intrear;//尾指针,假设队列不空,指向队列尾元素的
//下一个位置
};
三、功能设计:
程序中所涉及到的函数如下:
StatusInitQueue(SqQueue&Q)//构造一个空队列Q
StatusDestroyQueue(SqQueue&Q)//销毁队列Q,Q不再存在
StatusClearQueue(SqQueue&Q)//将Q清为空队列
StatusQueueEmpty(SqQueueQ)//假设队列Q为空队列,那么
//返回TRUE,否那么返回FALSE
intQueueLength(SqQueueQ)//返回Q的元素个数,即队列长度
StatusGetHead(SqQueueQ,QElemType&e)//假设队列不空,那么用e返回Q的对
//头元素,并返回OK,否那么返回ERROR
StatusEnQueue(SqQueue&Q,QElemTypee)//插入元素e为Q的新的队尾元素
StatusDeQueue(SqQueue&Q,QElemType&e)//假设队列不空,那么删除Q的队头
//元素,用e返回其值,并返回
//OK,否那么返回ERROR
StatusQueueTraverse(SqQueueQ,void(*vi)(QElemType))//从队头到队尾依次
//对队列Q中每个元素调用函数
//vi()。
一旦vi失败,那么操作失败
四、源程序:
//c1.h(程序名)
#include
#include
#include//malloc()等
#include//INT_MAX等
#include//EOF(=^Z或F6),NULL
#include//atoi()
#include//eof()
#include//floor(),ceil(),abs()
#include//exit()
#include//cout,cin
//函数结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
//#defineOVERFLOW-2因为在math.h中已定义OVERFLOW的值为3,故去掉此
//行
typedefintStatus;//Status是函数的类型,其值是函数结果状态代码,如OK等
typedefintBoolean;//Boolean是布尔类型,其值是TRUE或FALSE
//c3-3.h
#defineMAXQSIZE10
structSqQueue
{
QElemType*base;
intfront;
intrear;
};
#include"c1.h"
typedefintQElemType;
#include"c3-3.h"
StatusInitQueue(SqQueue&Q)
{//构造一个空队列Q
Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
if(!
Q.base)//储存分配失败
exit(OVERFLOW);
Q.front=Q.rear=0;
returnOK;
}
StatusDestroyQueue(SqQueue&Q)
{//销毁队列Q,Q不再存在
if(Q.base)
free(Q.base);
Q.base=NULL;
Q.front=Q.rear=0;
returnOK;
}
StatusClearQueue(SqQueue&Q)
{//将Q清为空队列
Q.front=Q.rear=0;
returnOK;
}
StatusQueueEmpty(SqQueueQ)
{//假设队列Q为空队列,那么返回TREU,否那么返回FALSE
if(Q.front==Q.rear)//队列空的标志
returnTRUE;
else
returnFALSE;
}
intQueueLength(SqQueueQ)
{//Q
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
StatusGetHead(SqQueueQ,QElemType&e)
{//
if(Q.front==Q.rear)//队列空
returnERROR;
e=*(Q.base+Q.front);
returnOK;
}
StatusEnQueue(SqQueue&Q,QElemTypee)
{
if((Q.rear+1)%MAXQSIZE==Q.front)//队列满
returnERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
returnOK;
}
StatusDeQueue(SqQueue&Q,QElemType&e)
{
if(Q.front==Q.rear)//队列空
returnERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
returnOK;
}
StatusQueueTraverse(SqQueueQ,void(*vi)(QElemType))
{
inti;
i=Q.front;
while(i!
=Q.rear)
{
vi(*(Q.base+i));
i=(i+1)%MAXQSIZE;
}
printf("\n");
returnOK;
}
voidvisit(QElemTypei)
{
cout<<"\t"<
}
voidmain()
{
inti=0,a;
QElemTyped;
SqQueueQ;
InitQueue(Q);
cout<<"初始化队列后,队列空否?
(1:
空0:
否)"<cout<<"请输入整型队列元素,-1为提前完毕符:
\n";
do
{
cin>>d;
if(d==-1)
break;
i++;
EnQueue(Q,d);
}
while(icout<<"队列长度为:
"<cout<<"现在队列空否?
(1:
空0:
否)"<for(i=1;i<=QueueLength(Q);i++)
{
DeQueue(d);
cout<<"删除的元素为:
"<";
cin>>a;
EnQueue(Q,a);
}
cout<<"现在队列中的元素为:
\n";
QueueTraverse(Q,visit);
cout<<"\n";
GetHead(Q,a);
cout<<"现在对头元素为:
"<ClearQueue();
cout<<"清空队列后,对列空否?
(1:
空0:
否)"<cout<<"\n";
DestroyQueue(Q);
}
五、程序调试结果:
六、试验后的思考:
通过试验,对循环队列的功能有了更深的了解,同时也根本掌握了循环队列的构造、清空、销毁及队列元素的插入和删除等相关操作,也为以后的学习奠定了一定的根底。