循环队列

循环队列
循环队列

一、实验目的

1. 理解并掌握队列的逻辑结构和顺序存储结构,了解循环队列的特点;

2. 掌握循环队列中基本操作的相关算法;

3. 编程实现相关算法;

4. 学会利用循环队列解决实际问题。

二、实验条件

Visual C++。

三、实验原理及相关知识

1. 循环队列存储结构描述

#define MAXSIZE 100 //最大队列长度

typedef struct

{

QElemType *base; //存储空间基址

int front; //头指针

int rear; //尾指针

}SqQueue;

2. 基本操作的算法描述

设下标为index,队列长度为m,则下一个下标的累进循环计算公式为:

index_next = ( index+1 ) % m。

实验中涉及的三个关键操作时循环队列中求队列长度、入队和出队操作。

(1) 求长度

所谓求队列长度,即技术队列中元素的个数。

算法思想:根据循环队列的结构特征,可以用公式(Q.rear-Q.front+ MAXSIZE)%MAXSIZE直接计算出队列的长度。

算法描述

Status QueueLength(SqQueue Q)

{

return ( ( Q.rear-Q.front+ MAXSIZE) %MAXSIZE);

}//QueueLength

(2) 入队

入队运算实际上相当于顺序表中的插入运算,所不同的是这里只能在队尾插入元素。

算法思想:①将元素e插入循环队列中队尾元素的下一个存储空间

②修改队尾指针,根据循环累计公式计算出其新位置

算法描述

Status EnQueue(SqQueue &Q, QElemType e)

{

if ( ( Q.rear + 1 ) % MAXSIZE == Q.front )

return ERROR; //队列满

Q.base[Q.rear] = e;

Q.rear = ( Q.rear + 1 ) % MAXSIZE;

return OK;

}// EnQueue

(3) 出队

出队运算实际上相当于顺序表中的删除运算,所不同的是这里只能在队头删除元素。

算法思想:修改队头指针,根据循环累计公式计算出其新位置

算法描述

Status DeQueue(SqQueue &Q, QElemType &e)

{

if (Q.rear == Q.front ) return ERROR; //队列为空

e = Q.base[Q.front];

Q.front = ( Q.front + 1 ) % MAXSIZE;

return OK;

}// DeQueue

四、实验步骤

1. 使用C语言实现循环队列的初始化、计算长度、入队、出队和遍历算法

2. 用顺序存储方式构造一个循环队列Q,并输出构造好的队列和该队列的长度

3. 在第1步所构造的队列Q中将元素e入队,并将更新后的队列Q输出

4. 在第2步更新后所得到的队列Q中将队头元素出队,用变量e返回该元素,并将更新后的队列Q 输出

五、思考题及其它

1. 使用循环队列实现输出杨辉三角的前N行

2. 如何使用循环队列解决“猴子选大王“问题

【参考程序】

#include "stdio.h"

#include "malloc.h"

#define OK 1

#define ERROR 0

#define MAXQSIZE 10 /*最大队列长度+1*/

typedef int QElemType;

typedef struct {

QElemType *base;

int front;

int rear;

} SqQueue;

int InitQueue(SqQueue *Q){

Q->base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));

if(!Q->base) return ERROR;

Q->front = Q->rear = 0;

return OK;

}

int EnQueue(SqQueue *Q,QElemType e) {

if( (Q->rear+1)%MAXQSIZE==Q->front ) // 队列满

return ERROR;

Q->base[Q->rear]=e;

Q->rear=(Q->rear+1)%MAXQSIZE ;

return OK;

}

int DeQueue(SqQueue *Q, QElemType *e){

if(Q->front == Q->rear) // 队列空

return ERROR;

*e=Q->base[Q->front];

Q->front=(Q->front+1)%MAXQSIZE;

return OK;

}

int QueueLength(SqQueue Q){

return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;

}

void QueueTraverse(SqQueue Q){ /*从队头到队尾依次打印队列Q中每个元素*/ int i,k;

k=QueueLength(Q);

for(i=1;i<=k;i++){

printf("%d ",Q.base[Q.front]);

Q.front=(Q.front+1)%MAXQSIZE;

}

}

void main()

{

int n,e,i;SqQueue q;

InitQueue(&q); //初始化循环队列

printf("该循环队列最多可存放%d个元素\n",MAXQSIZE-1);

printf("请输入数据元素的个数n \n");

scanf("%d",&n);

printf("\n请输入%d个整数\n",n);

/*创建队列*/

for(i=1;i<=n;i++){

scanf("%d",&e);

EnQueue(&q, e); //入队

}

printf("q=");

QueueTraverse(q); //输出循环队列q的内容

fflush(stdin);//刷新缓冲区

printf("\n请输入入队元素e\n");

scanf("%d",&e);

EnQueue(&q, e); //入队

printf("q=");

QueueTraverse(q); //输出循环队列q的内容

fflush(stdin);//刷新缓冲区

printf("\n执行出队操作\n");

DeQueue(&q, &e); //出队

printf("出队元素是%d\n",e);//输出出队元素值printf("q=");

QueueTraverse(q); //输出循环队列q的内容}

试验 --循环队列的基本操作及应用

数据结构实验报告 ----试验三循环队列的基本操作及应用 一、问题描述: 熟悉并掌握循环队列的相关操作,自己设计程序,实现循环队列的构造、清空、销毁及队列元素的插入和删除等相关操作。 二、数据结构设计: #define MAXQSIZE 10 //最大队列长度 struct SqQueue { QElemType *base; //初始化动态分配存储空间 Int front; // 头指针,若队列不空,只想对列头元素 int rear; //尾指针,若队列不空,指向队列尾元素的 //下一个位置 }; 三、功能设计: 程序中所涉及到的函数如下: Status InitQueue(SqQueue &Q) //构造一个空队列Q Status DestroyQueue(SqQueue &Q) //销毁队列Q,Q不再存在 Status ClearQueue(SqQueue &Q) //将Q清为空队列 Status QueueEmpty(SqQueue Q) //若队列Q为空队列,则 //返回TRUE,否则返回FALSE int QueueLength(SqQueue Q) //返回Q的元素个数,即队列长度Status GetHead(SqQueue Q,QElemType &e)//若队列不空,则用e返回Q的对 //头元素,并返回OK,否则返回ERROR Status EnQueue(SqQueue &Q,QElemType e)//插入元素e为Q的新的队尾元素Status DeQueue(SqQueue &Q,QElemType &e)//若队列不空,则删除Q的队头 //元素,用e返回其值,并返回 //OK,否则返回ERROR Status QueueTraverse(SqQueue Q,void(*vi)(QElemType))//从队头到队尾依次 //对队列Q中每个元素调用函数 //vi()。一旦vi失败,则操作失败四、源程序: // c1.h (程序名) #include #include #include // malloc()等 #include // INT_MAX等 #include // EOF(=^Z或F6),NULL

数据结构-实验队列的实现

贵州大学实验报告 学院:计信学院专业:网络工程班级:091班姓名XXX 学号XXXXXXXXX 实验组 5 实验时间2011.12.02 指导教师XXXXX 成绩 实验项目名称 队列的实现 实 验目的1.掌握队列的思想及其存储实现。2.掌握队列的常见算法的程序实现。 实验原理1.根据实验内容编程,上机调试、得出正确的运行程序。 2. 编译运行程序,观察运行情况和输出结果。 3. 写出实验报告(包括源程序和运行结果)。 实验内容 1.采用链式存储实现队列的初始化、入队、出队操作。 2.采用顺序存储实现循环队列的初始化、入队、出队操作。 3.在主函数中设计一个简单的菜单,分别测试上述算法。

实验数据及其步骤链式存储队列: #include #include using namespace std; typedef int ElemType; struct Queue{ ElemType *queue; int front,rear,len; int Maxsize; }; void Initqueue(Queue &Q) { cout<<"队列初始化操作"<

C语言之循环队列的基本操作

1):循环队列的基本操作 #include #include #define OK 1 #define ERROR 0 typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等typedef int QElemType; #define MAXQSIZE 100 // 最大队列长度(对于循环队列,最大队列长度要减1) typedef struct { QElemType *base; // 初始化的动态分配存储空间 int front; // 头指针,若队列不空,指向队列头元素 int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置 }SqQueue; Status InitQueue(SqQueue &Q) { Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base) { return ERROR; } Q.front=Q.rear=0; return OK; } Status EnQueue(SqQueue &Q,QElemType e) { if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR; Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXQSIZE; return OK; } Status DeQueue(SqQueue &Q, QElemType &e) { if(Q.front==Q.rear) return ERROR; e=Q.base[Q.front]; Q.front=(Q.front+1)%MAXQSIZE; return OK; }

顺序队的基本操作

上机实验报告 学院:计算机与信息技术学院 专业:计算机科学与技术(师范)课程名称:数据结构 实验题目:顺序队的基本操作 班级序号:师范1班 学号: 2731 学生姓名:邓雪 指导教师:杨红颖 完成时间: 2015年12月25号

一、实验目的: 1.熟悉掌握队的定义、结构及性质;? 2. 熟练掌握循环队列的操作及应用,掌握循环队列的入队和出队等基本操作。? 3. 加深对队列结构的理解,逐步培养解决实际问题的编程能力 二、实验环境: Windows Microsoft Visual c++ 三、实验内容及要求: 掌握队列的概念及性质,并建立顺序队,实现如下功能: 1.建立一个顺序队 2.输出队 3.求队长 4.判队空 5.取队头 6.入队 7.出队 8. 清空栈 四、概要设计: 1、通过循环,由键盘输入一串数据。创建并初始化一个顺序队。 2、编写实现相关功能函数,完成子函数模块如下。 3、调用子函数,实现菜单调用功能,完成顺序表的相关操作。

#include <> #include <> #define maxsize 1024 typedef int datatype; //定义结构体 typedef struct { datatype data[maxsize]; int front,rear; }sequeue; sequeue *sq; //建立顺序队 sequeue *SET() { sequeue *sq; datatype x; sq=(sequeue *)malloc(sizeof(sequeue)); sq->front=maxsize-1; sq->rear=maxsize-1; printf("请输入要存入的结点值(以0结尾)\n"); scanf("%d",&x); while(x!=0) { sq->rear=(sq->rear+1)%maxsize; sq->data[sq->rear]=x; scanf("%d",&x); } printf("顺序队输入成功\n\n"); return sq; }

循环队列学习解析以与C语言实现

循环队列的学习解析以及C语言实现 首先我们先来了解一下队列的概念:队列是一种先进先出的线性表只能在表头删除在表尾插入,操作系统的作业队列就是队列的一个很好的应用。也有可以在两端均可进行插入和删除操作的队列,称为双端队列,但其用处并没有一般队列广泛。 ADT Queue { 数据对象: D={ai | ai∈ElemSet, i=1,2,...,n, n≥0} 数据关系: R1={ | ai-1, ai ∈D, i=2,...,n} (约定其中a1端为队列头,an端为队列尾)

基本操作: InitQueue(&Q) 初始化队列 DestroyQueue(&Q) 销毁队列 QueueEmpty(Q) 判断队列空否 QueueLength(Q) 求取队长 GetHead(Q, &e) 取对头元素 ClearQueue(&Q) 清空对列 EnQueue(&Q, e) 入队一个元素 DeQueue(&Q, &e) 出队一个元素 QueueTravers(Q, visit())访问队列}ADT Queue

队列也有两种存储结构,分别是顺序存储和链式存储。 队列的顺序结构和顺序表以及顺序栈的存储结构类似,他们所运用的都是一组地址连续的存储。其中队列需要附设两个整形变量front 和rear 分别指示队列头元素和队列的尾元素的位置。 (1)空队列 (2)a,b,,c 相继入队 由于顺序队列所分配的空间有限,根据队列入队和出队的特点可能发生“假溢出”现象,即队尾元素无法在前移。解决的办法就是将队列抽象成为环状,即循环队列。 c b a 5 4 3 2 1 0 Q.rear → Q.fron → Q.rea → Q.fron →

顺序循环队列表实现

顺序循环队列表实现

————————————————————————————————作者:————————————————————————————————日期:

队列的基本概念 队列也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系与线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作,在其另一端进行删除操作。 队列中允许进行插入操作的一端称为队尾。允许进行删除操作的一端称为队头。队头和队尾分别由队头指针和队尾指针指示。队列的插入操作称为入队列,队列的删除操作称为出队列。最先入队列的元素总是最先出队列,所以队列也称为先进先出表。 下图是一个一次向队列中插入数据元素a0,a1,a2,….an-1后的示意图,其中,a0是当前队头数据元素,an-1是当前队尾的数据元素。 队头队尾 a0 a1 a2 ……an-1 <-出<-入 队列抽象数据类型 数据集合: 队列的数据集合可以表示为a0,a1,a2,a3….an-1,每个数据元素的数据类型为DataType。 操作集合: (1)初始化QueueInitiate(Q):初始化队列Q (2)非空否QueueNotEmpty(Q):队列Q非空否,若队列非空,函数返回值为1。否则,函数返回0。 (3)入队列QueueAppend(Q,x):在队列Q的队尾插入数据元素x。入队列成功返回1; 失败则返回0。 (4)出队列QueueDelete(Q,d):把队列Q的队头数据元素删除并由参数d带回。如出队列成功,返回1;失败则返回0。 (5)取队头数据元素QueueGet(Q,d):取队头数据元素并由参数d带回。如取到数据元素返回1,否则,返回0。 顺序队列 顺序存储结构的队列称作顺序队列

实验二 栈与队列操作实验题目

实验二栈与队列操作 实验目的: (1)理解栈与队列的结构特征和运算特征,以便在实际问题背景下灵活运用。 (2)了解复杂问题的递归算法设计。 本次实验中,下列实验项目选做一。 1、顺序栈的基本操作 [问题描述] 设计算法,实现顺序栈的各种基本操作 [基本要求] (1)初始化栈s。 (2)从键盘输入10个字符以$结束,建立顺序栈。 (3)从键盘输入1个元素,执行入栈操作。 (4)将栈顶元素出栈。 (5)判断栈是否为空。 (6)输出从栈顶到栈底元素。 要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。 2、链栈的基本操作 [问题描述] 设计算法,实现链栈的各种基本操作 [基本要求] (1)初始化栈s。 (2)从键盘输入10个字符以$结束,建立带头结点的链栈。 (3)从键盘输入1个元素,执行入栈操作。 (4)完成出栈操作。 (5)判断栈是否为空。 (6)输出从栈顶到栈底元素。 (7)输出链栈的长度。 要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。 3、循环队列的基本操作 [问题描述] 设计算法,实现循环顺序队列的建立、入队、出队等操作。 [基本要求] (1)从键盘输入10个字符以$结束,建立循环队列,并显示结果。 (2)从键盘输入1个元素,执行入队操作,并显示结果。 (3)将队头元素出队,并显示结果。 (4)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。

4、只用尾指针表示的循环链表队列的综合操作 [问题描述] 假设以带头结点的的循环链表表示队列,并且只设一个指针指向队尾元素的结点(注意不设头指针),试编写队列初始化、入队、出队函数。 [基本要求及提示] (1)首先定义链表结点类型。 (2)编写带头结点的循环链表的初始化函数,只用尾指针表示。 (3)编写入队函数、出队函数。 (4)在主函数中编写菜单(1.初始化;2.入队;3.出队;4.退出),调用上述功能函数。 5、用标志域表示队空队满状态的循环队列的综合操作 [问题描述] 要求循环队列不损失一个空间全部都得到利用,设置一个标志域tag,以0和1来区分当队头与队尾指针相同时队列状态的空和满,试编写与此结构相对应的入队和出队操作。 [基本要求及提示] (1)教材中为区分当队头与队尾指针相同时队列状态的空和满,以牺牲一个空间的代价来实现的,空:Q->front==Q->rear,满:(Q->rear+1)%MAXSIZE==Q->front。 (2)本题不损失一个空间全部都得到利用,为此如下定义循环队列类型: Typedef struct { QueueElementType element[MAXSIZE]; int front; int rear; int tag; }SeqQueue; 此时,循环队列空和满的条件分别为: Q->front==Q->rear&&tag==0 和 Q->front==Q->rear&&tag==1 (3)编写入队函数、出队函数。 (4)在主函数中编写菜单(1.入队;2.出队;3.退出),调用上述功能函数。 6、利用辅助数组进行栈的逆置 [问题描述] 利用辅助栈将栈中的元素逆置。 [基本要求及提示] 在主函数中编写菜单(1.入栈;2.出栈;3.逆置;4.退出)调试运行程序。 7、利用辅助栈进行队列的逆置 [问题描述] 利用辅助栈进行队列元素逆置。 [基本要求及提示] 在主函数中编写菜单(1.入队;2.出队;3.逆置;4.退出)调试运行程序。 8、Hanoi塔问题

实验4顺序循环队列基本操作

实验4: 顺序循环队列基本操作 一、实验目的 1.熟悉并能实现顺序循环队列的定义和基本操作。 2.了解用队列解决实际应用问题。 二、实验要求 1.进行队列的基本操作时要注意队列“先进先出”的特性。 2.复习关于栈操作的基础知识。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容 1.任意输入队列长度和队列中的元素值,构造一个队列,对其进行清空、插入新元素、返回队头元素以及删除队头元素操作。 2.约瑟夫环的实现:设有n个人围坐在圆桌周围,现从某个位置i 上的人开始报数,数到m 的人就站出来。下一个人,即原来的第m+1个位置上的人,又从1开始报数,再是数到m的人站出来。依次重复下去,直到全部的人都站出来,按出列的先后又可得到一个新的序列。由于该问题是由古罗马著名的史学家Josephus提出的问题演变而来,所以通常称为 Josephus 问题。 例如:当n=8,m=4,i=1时,得到的新序列为: 4,8,5,2,1,3,7,6 编写程序选择循环队列(也可换为自己熟悉的数据结构)作为存储结构模拟整个过程,并依次输出出列的各人的编号。 3.(选做实验)设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 程序编写提示:以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。

循环队列算法

前天写了栈的实现,今天到队列了,好像明天要期中考试,还是三科,次奥,考吧考吧,五一三天已经贡献给你们了,考成什么样我也认了,毕竟智商在这里。说好的一天来一发,不要说我水,其实我还真的是水,上个学期数据结构课打酱油,这个学期又自己抱本书从第一页开始恭恭敬敬地学,不敢跳过一个字。估计是脑子里面灌浆了。上学期不认真。前车之鉴,希望筒子们好好的把数据结构学好。希望老夫子还为时不晚。 队列和栈一样也是一种很基本的数据结构,队列的用途很多,下面是两个例子。 第一个例子就是CPU资源的竞争问题。在具有多个终端的计算机系统中,有多个用户需要使用CPU各自运行自己的程序,它们分别通过各自终端向操作系统提出使用CPU的请求,操作系统按照每个请求在时间上的先后顺序,将其排成一个队列,每次把CPU分配给队头用户使用,当相应的程序运行结束,则令其出队,再把CPU分配给新的队头用户,直到所有用户任务处理完毕。 第二个例子就是主机与外部设备之间速度不匹配的问题。以主机和打印机为例来说明,主机输出数据给打印机打印,主机输出数据的速度比打印机打印的速度要快得多,若直接把输出的数据送给打印机打印,由于速度不匹配,显然是不行的。所以解决的方法是设置一个打印数据缓冲区,主机把要打印输出的数据依此写如到这个缓冲区中,写满后就暂停输出,继而去做其它的事情,打印机就从缓冲区中按照先进先出的原则依次取出数据并打印,打印完后再向主机发出请求,主机接到请求后再向缓冲区写入打印数据,这样利用队列既保证了打印数据的正确,又使主机提高了效率。 通过上面的两个例子我们知道队列和栈之间的本质的区别了。栈是遵循先进后出,而队列则是遵循先进先出。由于它的先进先出,导致当队头的元素出来之后,队头的指针会上移,往队尾插入元素的时候队尾的指针也是往上移,这个和我们平时的生活经验可能不一样,以我们平时的生活经验,排队买票,队头的人买完票之后,后面的人会向前补上来,这一补可是所有的人都要往前移动一个位置,这在计算机的队列中就相当于要后面的所有元素都要往前进一个位置,这个开销是很大的,所以,计算机中的队列没有采取这样的方法。但是这样之后另外一个问题又出来了,当把队头的元素移走之后,队头上移,我们知道,队列插入元素是从后面插入的,这就造成了队头前面的内存空出来了,而且还不能用了,因为我们不能把元素从队头插进去。于是乎,聪明的人们想到了循环队列这种东西。当队尾插不进去,队头前面又还有空位的时候,就把队尾下调到队头前面的位置,但记住他还是队尾,如此下去,就不会担心内存的浪费了。下面用图来解释一下:

链队列和循环队列数据结构实验

淮海工学院计算机科学系实验报告书 课程名:《数据结构》 题目:数据结构实验 链队列和循环队列 班级: 学号: 姓名:

线性数据结构算法实现与应用报告要求 1目的与要求: 1)掌握栈与队列的数据类型描述及特点; 2)掌握栈的顺序和链式存储存表示与基本算法的实现; 3)掌握队列的链式存储表示与基本操作算法实现; 4) 掌握栈与队列在实际问题中的应用和基本编程技巧; 5)按照实验题目要求,独立完成实际程序的编写编写、调试和运行,并通过用例数据的运行过程抓获相关屏面验证程序设计的正确性; 7)认真书写实验报告,并按时提交。 2 实验内容或题目 以下题目学生根据自己的兴趣和能力可选作一道作为实验题目: 1)根据栈数据结构,分别建立一个顺序栈和链式栈并实现其上基本操作(出栈和入栈等); 2)根据队列数据结构,分别建立链队列和循环队列,并完成其上的基本操作(出入队列等); 3)参考书上表达式求值例题,应用栈的基本操作实现带括号表达式求值运算及其进出栈模拟过程(给出程序执行过程中栈的变化过程); 4)阅读P83栈与递归的实现一节内容和3阶汉诺塔问题。使用栈数据结构解决3阶汉诺塔问题,编写程序并模拟栈及其汉诺塔的搬运过程(给出程序执行过程栈的变化过程与圆盘的搬动状态)。 5)其它实际应用举例(如打印杨辉三角形)。 3 实验步骤与源程序 链队列 #include #include #include #define OK 1 #define ERROR 0 #define OVERFLOW 0 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; int InitQueue(LinkQueue &Q)

循环队列的操作和实现C语言

循环队列的基本操作都可以实现,后面有代码。

代码: #include #include #include #include #define MAX_SIZE 10//定义循环队列的长度typedef struct{ int*base; int front; int rear; int full;//队列是否已满的标志位}Queue; int creat_queue(Queue*q); int en_queue(Queue*q,int e); int out_queue(Queue*q,int*e); int destroy_queue(Queue*q); int length_queue(Queue*q);

void main() { Queue q; int m,n,i,e,f,f1,k=0; int a1,a2,a3,a4,a5,a6;//用来接函数返回值 int *e1,*e2; q.base=NULL; e1=e2=&k;//对于指针最好这样初始化定义一下,因为只声明是没有分陪内存的,不能直接用*e printf("----------------循环队列的基本操作---------------\n"); printf("----------------1.创建一个空队列-----------------\n"); printf("----------------2.单次入队列---------------------\n"); printf("----------------3.单次出队列---------------------\n"); printf("----------------4.集体入队列---------------------\n"); printf("----------------5.集体出队列---------------------\n"); printf("----------------6.队列元素个数-------------------\n"); printf("----------------7.销毁队列-----------------------\n"); printf("----------------0.退出---------------------------\n"); loop: printf("请选择:"); scanf("%d",&m); switch(m) { case 1: a1=creat_queue(&q); if(a1==0) { printf("队列已经存在,请先销毁原来队列!\n"); break;} printf("OK!队列创建成功!\n"); break; case 2: printf("请输入要入队列的元素(整型):"); scanf("%d",&e); a2=en_queue(&q,e); if(a2==-1) { printf("队列不存在,请先创建队列!\n"); break; } else if(a2==0) { printf("入队失败!因为队列满了!\n"); break; } else { printf("OK!入队成功!\n"); break; } case 3: a3=out_queue(&q,e1);

实验八-队列(循环队列)的表示和实现-舞伴问题

浙江大学城市学院实验报告 课程名称数据结构基础 实验项目名称实验八队列(循环队列)的表示和实现 学生姓名*** 专业班级信管1104 学号3110**** 实验成绩指导老师(签名)日期 一.实验目的和要求 1、掌握队列的存储结构及基本操作。 2、掌握循环队列的设置及循环队列的各种基本操作的实现。 3、通过具体的应用实例,进一步熟悉和掌握队列的实际应用。 二.实验内容 1、建立头文件SeqQueue.h,定义顺序存储的循环队列存储结构,并编写循环队列的各种基本操作实现函数。同时建立一个验证操作实现的主函数文件test3_2.cpp,编译并调试程序,直到正确运行。 2、选做:编写程序,实现舞伴问题。假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队,跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴,若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。要求设计一个函数void partner(),模拟上述舞伴配对问题。 基本要求: 1) 由键盘输入数据,每对数据包括姓名和性别; 2) 输出结果包括配成舞伴的女士和男士的姓名,以及未配对者的队伍名称和队头者的姓名; 3) 要求利用SeqQueue.h中已实现的顺序循环队列的基本操作函数来实现。函数void partner() 添加到文件test3_2.cpp中,在主函数中进行调用测试。 3、填写实验报告,实验报告文件取名为report8.doc。 4、上传实验报告文件report8.doc、源程序文件test3_2.cpp及SeqQueue.h 到Ftp服务器上自己的文件夹下。 三. 函数的功能说明及算法思路 (包括每个函数的功能说明,及一些重要函数的算法实现思路) 1)InitQueue(Queue &q) 实现初始化队列的功能 2)EnQueue(Queue &q,ElemType item) 向队列插入元素item

嵌入式系统课程设计__多线程实现环形缓冲区数据的输入输出控制

物理与电子工程学院 《嵌入式系统与应用》课程设计报告 题目多线程实现环形缓冲区数据的输入输出控制 系别物理与电子工程学院 年级专业 班级学号 学生姓名 指导教师职称 设计时间2015.6.4 ~2015.6.28

目录 第一章绪论 (2) 1.1 课题目的和重点问题 (2) 1.1.1 目的和意义 (2) 1.1.2 重点解决的问题 (2) 1.1.3 系统实现的具体功能 (2) 第二章正文 (3) 2.1 功能需求分析 (3) 2.1.1 功能需求分析 (3) 2.1.2 功能实现环境分析 (3) 2.2 系统设计 (4) 2.2.1 功能框图 (4) 2.2.2 模块的功能 (4) 2.3 技术实现 (10) 2.3.1 模块的实现 (10) 2.3.2 问题的解决 (11) 2.4 总结 (15) 参考文献 (15)

第一章绪论 1.1 课题目的和重点问题 1.1.1 目的和意义 通过使用Linux环境下的C语言编程,完成环形缓冲区数据的输入输出控制。来加深对Linux多线程编程实现的认识和操作。 1.1.2 重点解决的问题 在解决环形缓冲区数据的输入输出控制的实验中,一是要解决实现多线程的同步工作问题,二是如何使用串口发送数据。 1.1.3 系统实现的具体功能 利用ARM9的开发平台在Linux操作系统中,程序设计一个环形缓冲区,A线程不断填充缓冲区数据(按串口收到的初始值开始,每次减一填入;串口发来的初始化数据更改能及时更新缓冲区),B线程每隔1ms从缓冲区读出数据(若此时缓冲区空,则打印一个警告信息),缓冲区每读到一个特定数据则控制Led灯点亮一次(3个灯不同的特定数据控制),点亮灯由C线程控制,串口的输入响应由D线程实现。当串口输入一个非数字则整个程序退出。

循环队列实现数据的入队与出对程序算法

#include #include #define maxlen 11 typedef struct{ int data[maxlen]; int front; int rear; }seqqueue; seqqueue *seq() { seqqueue *Q; Q=(seqqueue *)malloc(sizeof(seqqueue)); Q->front=0; Q->rear=0; return Q; } int full(seqqueue *Q){ if(Q->front==(Q->rear+1)%maxlen) return 1; else return 0; } int empty(seqqueue *Q){ if (Q->front==Q->rear) return 1; else return 0; } void add(seqqueue *Q,int x) { if(!full(Q)) { Q->rear=(Q->rear+1)%maxlen; Q->data[Q->rear]=x; } else printf("queue full!"); } void del(seqqueue *Q) { if(!empty(Q)) Q->front=(Q->front+1)%maxlen; else printf("queue empty");

} int length(seqqueue *Q) { int a; a=(Q->rear-Q->front+maxlen)%maxlen; return a; } void out(seqqueue *Q) { int i,j,y; j=length(Q); for(i=1;ifront+i)%maxlen; printf("%3d",Q->data[y]); } } void main() { seqqueue Q; int i,x,n; Q=*seq(); printf("该循环最多存放10个数。\n"); printf("请输入你要输入元素的个数:"); scanf("%d",&n); printf("请输入%d个元素:",n); for(i=0;i

试验 循环队列的基本操作及应用

数据结构实验报告 --—-试验三循环队列的基本操作及应用 一、问题描述: 熟悉并掌握循环队列的相关操作,自己设计程序,实现循环队列的构造、清空、销毁及队列元素的插入和删除等相关操作。 二、数据结构设计: #define MAXQSIZE 10 //最大队列长度 struct SqQueue { ? QElemType *base; //初始化动态分配存储空间 Int front; //头指针,若队列不空,只想对列头元素 int rear;//尾指针,若队列不空,指向队列尾元素的 //下一个位置 }; 三、功能设计: 程序中所涉及到的函数如下: Status InitQueue(SqQueue &Q) //构造一个空队列Q Status DestroyQueue(SqQueue&Q) //销毁队列Q,Q 不再存在 Status ClearQueue(SqQueue &Q) //将Q清为空队列 Status QueueEmpty(SqQueue Q)//若队列Q 为空队列,则 //返回TRUE,否则返回FALSE int QueueLength(SqQueue Q) //返回Q的元素个数,即队列长度 Status GetHead(SqQueueQ,QElemType &e)//若队列不空,则用e返回Q的对 //头元素,并返回OK,否则返回ERROR Status EnQueue(SqQueue &Q,QElemType e)//插入元素e为Q的新的队尾元素 Status DeQueue(SqQueue&Q,QElemType &e)//若队列不空,则删除Q的队头 //元素,用e返回其值,并返回

编写一个程序实现顺序循环队列的各种基本运算

编写一个程序实现顺序循环队列的各种基本运算编写一个程序实现顺序循环队列的各种基本运算,并在此基础上设计一个主程序完成如 下功能。 (1)初始化队列Q。 (2)判断队列Q是否非空。 (3)依次进队元素A,B,C。 (4)出队一个元素,输出该元素。 (5)输出队列Q的元素个数。 (6)依次进队元素D,E,F。 (7)输出队列Q的元素个数。 (8)输出出队序列。 (9)释放队列。 源程序代码: #include #include #define Maxqsize 5 typedef char ElemType; typedef struct { ElemType elem[Maxqsize]; int front,rear; }SqQueue;

void InitQueue(SqQueue *&q) { q=(SqQueue *)malloc (sizeof(SqQueue)); q->front=q->rear=0; } void ClearQueue(SqQueue *&q) { free(q); } int QueueLength(SqQueue *q) { return (q->rear-q->front+Maxqsize)%Maxqsize; } int QueueEmpty(SqQueue *q) { return(q->front==q->rear); } int enQueue(SqQueue *&q,ElemType e) { if ((q->rear+1)%Maxqsize==q->front) return 0; q->rear=(q->rear+1)%Maxqsize; q->elem[q->rear]=e; return 1; } int deQueue(SqQueue *&q,ElemType &e)

队列存储与操作实验报告

实验四队列存储与操作 一、实验目的 1、掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,队列顺序存储结构、链式存储结构和循环队列的实现,以便在实际问题背景下灵活运用。 二、实验内容 1.顺序队列的实现和运算 2.链式队列的实现和运算 3.循环队列的实现和运 三、详细设计: 1、顺序队列的实现: #include using namespace std; const int Size=100; typedef char DataType; class CirQueue { public: CirQueue() { front=rear=0;//构造队列,初,front和rear指向 } ~CirQueue(){} void EnQueue(DataType x) { if((rear+1)%Size==front) { cout<<"队列已经满了"<

cout<<"队列为空"<

编写函数实现循环队列的判队空、取队头元素、入队、出队算法。

7、编写函数实现循环队列的判队空、取队头元素、入队、出队算法。#include #include #define maxize 64 typedef char datatype; typedef struct{ datatype data[maxize]; int front ,rear; }sequeue; sequeue *q; char x; //初始化 void *nitiqueue() { q=(sequeue*)malloc(sizeof(sequeue)); q->front=maxize-1; q->rear=maxize-1; return q; } //判断是否为空 void empty(sequeue*q) { if(q->front==q->rear) printf("为空!\n"); else printf("不为空!"); } //入队 int pushqueue(sequeue*q,datatype x) { printf("输入插入元素:"); scanf("%c",&x); while(x!='\n'){ if((q->rear+1)%maxize==q->front) { printf("队满!"); return -1; } else { q->rear=(q->rear+1)%maxize; q->data[q->rear]=x;

} scanf("%c",&x); } } //出队 void popqueue(sequeue*q) { if(q->rear==q->front) { printf("队空!/n"); } else q->front=(q->front+1)%maxize; printf("出队元素为:%c\n",q->data[q->front]); } //输出队列长度 void length(sequeue *q) { int j=q->front;int i=0; while(j!=q->rear) { i++; j=j+1; } printf("队列长度为:%d\n",i); } //输出队列 void pop(sequeue*q) { int i=q->front; while(i!=(q->rear)+1) { printf("%c\n",q->data[i]);i=(i+1)%maxize; } } int main(void) { nitiqueue(); empty(q); pushqueue(q,x); popqueue(q) ; length(q); pushqueue(q,x);

实验二 栈和队列(基本操作)

实验二栈和队列 1、实验目的: (1)熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现; (2)熟悉队列的特点(先进先出)及队列的基本操作,如入队、出队等,掌握队列的基本操作在队列的顺序存储结构和链式存储结构上的实现。 2、实验要求: (1)复习课本中有关栈和队列的知识; (2)用C语言完成算法和程序设计并上机调试通过; (3)撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括时间复杂度、空间复杂度以及算法优化设想)、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果)。 3、实验内容 [实验1] 栈的顺序表示和实现 实验内容与要求: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍历顺序栈 (6)置空顺序栈 分析: 栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。

对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:p->top= =MAXNUM-1,栈满时,不能入栈; 否则出现空间溢出,引起错误,这种现象称为上溢。 出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空作为一种控制转移的条件。 注意: (1)顺序栈中元素用向量存放 (2)栈底位置是固定不变的,可设置在向量两端的任意一个端点 (3)栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置 #include <> #include <> typedef int SElemType; typedef int Status; #define INIT_SIZE 100 #define STACKINCREMENT 10 #define Ok 1 #define Error 0 #define True 1 #define False 0 typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack;

相关文档
最新文档