队列实验报告.docx
《队列实验报告.docx》由会员分享,可在线阅读,更多相关《队列实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
队列实验报告
一.实验项目名称
循环队列和链式队列的创建
二、实验目的
1、掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,
2、队列顺序存储结构、链式存储结构和循环队列的实现,以便在实际问题背景下灵活应用。
三、实验内容
1.链式队列的实现和运算
2.循环队列的实现和运算
四、主要仪器设备及耗材
VC++6.0运行环境实现其操作
五.程序算法
(1)循环队列操作的算法
1>进队列
Voidenqueue(seqqueue&q,elemtypex)
{
if((q.rear+1)%maxsize==q.front)
cout<<”overflow”;
else{
q.rear=(q.rear+1)%maxsize;//编号加1或循环回第一个单元
q.queue[q.rear]=x;
}
}
2>出队列
Voiddlqueue(seqqueue&q)
{
if(q.rear==q.front)cout<<”underflow”;
else
q.front=(q.front+1)%maxsize;
}
3>取对头元素
elemtypegethead(seqqueueq)
{if(q.rear==q.front)
{cout<<”underflow”;
returnNULL;}
elsereturnq.queue[(q.front+1)%maxsize];
//front指向队头前一个位置
}
4>判队列空否
intempty(seqqueueq)
{
if(q.rear==q.front)reurn1;
elsereturn0;
}
(2).链队列操作的算法
1>.链队列上的初始化
voidINIQUEUE(linkqueue&s)
{link*p;
p=newlink;
p->next=NULL;//p是结构体指针类型,用->
s.front=p;//s是结构体变量,用.
s.rear=p;//头尾指针都指向头结点
}
2>.入队列
voidpush(linkqueue&s,elemtypex)
{
link*p;//p是结构体指针类型,用->
p=newlink;
p->data=x;
p->next=s.rear->next;//s是结构体变量,用.
s.rear->next=p;
s.rear=p;//插入最后
}
3>判队空
intempty(linkqueues)
{if(s.front==s.rear)return1;
elsereturn0;
}
4>.取队头元素
elemtypegethead(linkqueues)
{
if(s.front==s.rear)returnNULL;
elseretuens.front->next->data;
}
5>.出队列
voidpop(linkqueue&s)
{link*p;
p=s.front->next;
if(p->next==NULL)//链队列中只有一个元素,需要修改rear指针{s.front->next=NULL;
s.rear=s.front;}
else
s.front->next=p->next;//rear不用变
delete(p);
}
六.程序源代码
a.循环队列源代码
#include
#defineMAXN20
structseq
{
charqueue[MAXN];
intfront,rear;
};
voidiniq(seq&q)
{
q.front=q.rear=MAXN-1;
}
voidenq(seq&q,charx)
{
if((q.rear+1)%MAXN==q.front)
cout<<"overflow";
else{
q.rear=(q.rear+1)%MAXN;
q.queue[q.rear]=x;
}
//return(0);
}
voiddlq(seq&q)
{
if(q.rear==q.front)
cout<<"underflow";
else
q.front=(q.front+1)%MAXN;
}
intgethead(seq&q)//取队头元素
{if(q.rear==q.front)//判断是否队列为空
cout<<"underflow";
else
returnq.queue[(q.front+1)%MAXN];
}
main()
{seqq;
inti,y;
iniq(q);
cout<<"输入元素入队0为止"<cin>>i;
while(i)
{
enq(q,i);
cin>>i;
}
y=gethead(q);
cout<<"队头为="<dlq(q);
y=gethead(q);
cout<<"执行一次删除队头后,队头为="<}
b.链队列的源代码
#include
typedefstructQNode
{
chardata;
QNode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
InitQueue(LinkQueue&Q)
{
Q.front=Q.rear=newQNode;
Q.front->next=NULL;
return0;
}
EnQueue(LinkQueue&Q,chare)
{
QueuePtrp;
p=newQNode;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return0;
}
voiddisp(LinkQueue&Q)//打印队列
{
QueuePtrp;
p=Q.front->next;
while(p!
=NULL)
{
cout<data<<"->";
p=p->next;
}
}
DeQueue(LinkQueue&Q,char&e)
{
QueuePtrp;
if(Q.front==Q.rear)return1;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
deletep;
return0;
}
voidmain()
{
LinkQueueQ;
chare,e1;
InitQueue(Q);
cout<<"输入队列元素,0时结束:
"<cin>>e;
while(e!
='0'){
EnQueue(Q,e);
cin>>e;
}
cout<<"队列为:
"<disp(Q);
DeQueue(Q,e1);
cout<"<cout<<"队列为:
"<disp(Q);
cout<}
六.程序输入数据及实验结果
a.循环队列实验结果
c.链队列实验结果
七、思考讨论题或体会或对改进实验的建议
(1)体会
a.C++语言知识不懂,需要好好学习;
b.对单链表不够熟悉,要多练习创建单链表及其基本操作。
八、参考资料
a.《数据结构》李根强主编中国国水利水电出版社
b.《C++语言程序设计》郑莉董渊何江舟编清华大学出版社