实验4栈与队列实验 续.docx

上传人:b****9 文档编号:26251581 上传时间:2023-06-17 格式:DOCX 页数:15 大小:51.86KB
下载 相关 举报
实验4栈与队列实验 续.docx_第1页
第1页 / 共15页
实验4栈与队列实验 续.docx_第2页
第2页 / 共15页
实验4栈与队列实验 续.docx_第3页
第3页 / 共15页
实验4栈与队列实验 续.docx_第4页
第4页 / 共15页
实验4栈与队列实验 续.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

实验4栈与队列实验 续.docx

《实验4栈与队列实验 续.docx》由会员分享,可在线阅读,更多相关《实验4栈与队列实验 续.docx(15页珍藏版)》请在冰豆网上搜索。

实验4栈与队列实验 续.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1