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

实验四循环队列的基本操作实验目的:1、熟悉将算法转换成程序代码的过程。
2、了解单循环队列的逻辑结构特性,熟练掌握循环队列顺序存储结构的C 语言描述方法。
3、熟练掌握循环队列的基本操作:入队、出队等,掌握循环队列的存取特性。
实验内容:1、分别建立包含6个数据元素的循环队列;2、从键盘输入一个数据元素x,进行入队操作;3、获取队头元素的值;4、对循环队列进行出队操作;5、打印循环队列元素和队列长度;6、给出程序及各项操作结果。
实验步骤:#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define MAXSIZE 100 /*队列的最大容量*/typedef int DataType;typedef struct {DataType data[MAXSIZE]; /*队列的存储空间*/int front, rear; /*队头队尾指针*/}SeqQueue,*PSeqQueue;PSeqQueue Init_SeqQueue( ){ /*初始化一新队列,入口参数:无,返回值:新顺序队列指针,null表示失败*/ PSeqQueue Q;Q=( PSeqQueue )malloc(sizeof(SeqQueue));if (Q){Q->front=0;Q->rear=0;printf("置空队列成功!");}return Q;}void Destroy_SeqQueue(PSeqQueue *Q){ /*销毁一队列,入口参数:要销毁的顺序队列指针的地址,返回值:无*/ if (*Q)free(*Q);*Q=NULL;}int Empty_SeqQueue(PSeqQueue Q)/*判断队列是否为空,入口参数:顺序队列,返回值:1表示为空,0表示非空*/{ if (Q && Q->front==Q->rear)return (1);elsereturn (0);}int QueueLength (PSeqQueue Q){学生自己写}//返回Q的元素个数,即队列的长度int In_SeqQueue ( PSeqQueue Q , DataType x)/*入队操作,入口参数:顺序队列和待入队元素x ,返回值:1表示成功,-1表示队满溢出*/{ if ((Q->rear+1)%MAXSIZE==Q->front){ printf("队满");return -1; /*队满不能入队*/}else{ Q->rear=(Q->rear+1) % MAXSIZE;Q->data[Q->rear]=x;return 1; /*入队完成*/}}int Out_SeqQueue (PSeqQueue Q,DataType *x){ /*出队操作,入口参数:顺序队列,返回值:1表示成功,-1表示队空,出队的元素保存到*x */if (Empty_SeqQueue(Q)){printf("队空");return -1; /*队空不能出队*/}else{ Q->front=(Q->front+1) % MAXSIZE;*x=Q->data[Q->front];return 1; /*出队完成*/}}int Front_SeqQueue(PSeqQueue Q ,DataType *x){ /*取队头元素,入口参数:顺序队列和取出元素存放地址,返回值:1表示成功,-1表示队空*/if (Q->front==Q->rear){printf("队空");return -1; /*队空不能得到队头元素*/}else{ *x=Q->data[(Q->front+1)%MAXSIZE];return 1; /*取队头元素操作完成*/}}void display(PSeqQueue S){学生填写}void main(){(由学生填写)}实验用测试数据和相关结果分析:(由学生填写)实验总结:(由学生填写)。
04循环队列的基本操作

n=Empty(&Q);
if(n==1)printf("队空\n");
else printf("队非空\n");
break;
case 5:h=QueueLength(&Q);
printf("队长为:%d\n",h);
break;
case 0:exit(0);break;
}
DataType Dequeue(Cirqueue *Q)//出队
{
if(Q->rear==Q->front)
{
printf("下溢");exit(-1);
}
Q->front=(Q->front+1)%Queuesize;//队头指针在循环意义下加1
return Q->data[Q->front];//读取并返回出队前队头元素
void Initqueue(Cirqueue *Q)//初始化
{ Q->front=Q->rear=Queuesize-1; }
int Enqueue(Cirqueue *Q,DataType x)//入队
{ /*将x插入循环队列sq中,sq具有队头和队尾指针*/
if((flag==1)&&(Q->rear==Q->front)) /*判断队满*/
int main()
{
int key,x,n;//x为队列元素,n为判空标签
Cirqueue Q;
Initqueue(&Q);
noop:
printf("队列基本操作\n");
循环队列操作实验报告

实验目的:通过本次实验,掌握循环队列的基本概念和操作方法,了解其在实际应用中的优势,并能够熟练运用循环队列解决实际问题。
实验环境:操作系统:Windows 10编程语言:C语言开发环境:Visual Studio实验内容:1. 循环队列的定义及初始化2. 循环队列的入队操作3. 循环队列的出队操作4. 循环队列的判空操作5. 循环队列的判满操作6. 循环队列的遍历操作7. 循环队列的应用实例实验步骤:一、循环队列的定义及初始化1. 定义循环队列的数据结构:```c#define MAX_SIZE 100 // 定义队列的最大容量typedef struct {int data[MAX_SIZE]; // 存储队列元素的数组int front; // 队头指针int rear; // 队尾指针} CircleQueue;```2. 初始化循环队列:```cvoid InitQueue(CircleQueue q) {q->front = q->rear = 0; // 初始化队头和队尾指针}```二、循环队列的入队操作1. 判断队列是否已满:```cint IsFull(CircleQueue q) {return (q->rear + 1) % MAX_SIZE == q->front;}```2. 入队操作:```cint EnQueue(CircleQueue q, int e) {if (IsFull(q)) {return 0; // 队列已满,无法入队}q->data[q->rear] = e; // 将元素e入队q->rear = (q->rear + 1) % MAX_SIZE; // 更新队尾指针return 1; // 入队成功}```三、循环队列的出队操作1. 判断队列是否为空:```cint IsEmpty(CircleQueue q) {return q->front == q->rear;}```2. 出队操作:```cint DeQueue(CircleQueue q, int e) {if (IsEmpty(q)) {return 0; // 队列为空,无法出队}e = q->data[q->front]; // 将队头元素出队q->front = (q->front + 1) % MAX_SIZE; // 更新队头指针 return 1; // 出队成功}```四、循环队列的判空操作1. 判断队列是否为空:```cint IsEmpty(CircleQueue q) {return q->front == q->rear;}```五、循环队列的判满操作1. 判断队列是否已满:```cint IsFull(CircleQueue q) {return (q->rear + 1) % MAX_SIZE == q->front; }```六、循环队列的遍历操作1. 遍历循环队列:```cvoid TraverseQueue(CircleQueue q) {if (IsEmpty(q)) {printf("队列为空,无法遍历。
循环队列的基本操作

循环队列的基本操作循环队列是一种特殊的队列,它的队尾和队头是相连的。
相比于普通队列,在插入元素时可以循环利用队列的空间,提高了存储空间的利用效率。
循环队列的基本操作包括初始化队列、入队操作、出队操作以及判断队列是否为空或已满等。
下面将详细介绍循环队列的基本操作。
1.初始化队列:循环队列通常用一个数组来实现,在初始化队列时,需要初始化队头和队尾指针为空指针,将队头和队尾指针指向数组的第一个元素。
同时,需要设定队列的容量,以便后续操作判断队列是否已满。
2.入队操作:向队列插入元素的操作称为入队。
当队列未满时,可以将元素插入到队尾指针所指向的位置,并将队尾指针往后移动一位。
需要注意的是,如果队尾指针已经到达数组的末尾,则需要将其循环到数组的开头,保持队列的循环性质。
3.出队操作:从队列中删除元素的操作称为出队。
当队列非空时,可以将队头指针所指向的元素删除,并将队头指针往后移动一位,以表示队头的指向已经变为下一个元素。
同样需要注意的是,如果队头指针已经到达数组的末尾,则需要将其循环到数组的开头。
4.判断队列是否为空:队列为空的条件是队头指针和队尾指针相等,并且它们都为空指针。
如果队列为空,表示没有任何元素在队列中。
5.判断队列是否已满:队列已满的条件是队尾指针的下一个位置等于队头指针。
由于队列的存储空间是一定的,当队列已满时,无法再插入元素。
以上就是循环队列的基本操作。
循环队列的实现相对简单,但需要注意队列满和空的特殊情况的处理,以及前后指针的循环移动。
比较常见的应用场景是操作系统的任务调度、缓冲区、计算排队等。
循环队列的特点是可以高效地利用存储空间,并且入队和出队操作的时间复杂度都是O(1)。
但是循环队列的容量是固定的,当队列已满时无法再插入元素,需要特殊处理如扩容或缩容的情况。
另外,由于队列的元素是顺序存储的,删除元素后,仍然占用着存储空间,可能导致存储空间的浪费。
在实际应用中,可以通过设置一个计数器来记录队列中有效元素的个数,以解决这个问题。
最新顺序队的基本操作

上机实验报告学院:计算机与信息技术学院专业:计算机科学与技术(师范)课程名称:数据结构实验题目:顺序队的基本操作班级序号:师范1班学号:201421012731学生姓名:邓雪指导教师:杨红颖完成时间:2015年12月25号一、实验目的:1.熟悉掌握队的定义、结构及性质;2. 熟练掌握循环队列的操作及应用,掌握循环队列的入队和出队等基本操作。
3. 加深对队列结构的理解,逐步培养解决实际问题的编程能力二、实验环境:Windows 8.1Microsoft Visual c++ 6.0三、实验内容及要求:掌握队列的概念及性质,并建立顺序队,实现如下功能:1.建立一个顺序队2.输出队3.求队长4.判队空5.取队头6.入队7.出队8. 清空栈四、概要设计:1、通过循环,由键盘输入一串数据。
创建并初始化一个顺序队。
2、编写实现相关功能函数,完成子函数模块如下。
3、调用子函数,实现菜单调用功能,完成顺序表的相关操作。
五、代码#include <stdio.h>#include <stdlib.h>#define maxsize 1024typedef 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;}//判队空int EMPTY(sequeue *sq){if(sq->rear==sq->front)return 1;elsereturn 0;}//输出void PRINT(sequeue *sq){int i;if(EMPTY(sq))printf("sequeue is empty\n");else{i=(sq->front+1)%maxsize;while(i<=sq->rear){printf("%d ",sq->data[i]);i=(i+1)%maxsize;}}}//队长度int LENGTH(sequeue *sq){int count=0,i;if(EMPTY(sq))return count;else{i=(sq->front+1)%maxsize;while(i<=sq->rear){count++;i=(i+1)%maxsize;}return count;}}// 取队头datatype FRONT(sequeue *sq){datatype x;if(EMPTY(sq)){printf("sequeue is empty\n");return NULL;}else{x=sq->data[(sq->front+1)%maxsize];return x;}}//入队void ENQUEUE(sequeue *sq){datatype x;printf("请输入要插入的结点值\n");scanf("%d",&x);if(sq->front==(sq->rear+1)%maxsize){printf("sequeue is full\n");exit(0);}else{sq->rear=(sq->rear+1)%maxsize;sq->data[sq->rear]=x;printf("插入成功\n");}}//出队datatype DEQUEUE(sequeue *sq){if(EMPTY(sq)){printf("sequeue is empty\n");return NULL;}else{sq->front=(sq->front+1)%maxsize;return (sq->data[sq->front]);}}//置空队void SETNULL(sequeue *sq){sq->front=maxsize-1;sq->rear=maxsize-1;}//主函数void main(){ sequeue;int a,p;printf("\n——————————————————————————————————\n");printf("1、建立队\n");printf("2、输出队\n");printf("3、队长度\n");printf("4、判队空\n");printf("5、取队头\n");printf("6、入队\n");printf("7、出队\n");printf("8、清空队\n");printf("9、退出程序\n");printf("\n——————————————————————————————————\n\n ");do{printf("按需求选择功能: ");scanf("%d",&a);switch(a){case 1: sq=SET();break;case 2: printf("该队列内容为:\n\n");PRINT(sq);break;case 3: printf("队长度为:%d\n\n",LENGTH(sq));break;case 4: if(EMPTY(sq))printf("sequeue is empty\n");elseprintf("sequeue is not empty\n");break;case 5: p=FRONT(sq);printf("队头元素为:%d\n",p);break;case 6: ENQUEUE(sq);printf("插入新元素后的队为:\n\n");PRINT(sq);break;case 7: printf("出队操作前队头元素为:%d\n",DEQUEUE(sq));printf("出队后队列内容为:\n");PRINT(sq);break;case 8: SETNULL(sq);if(EMPTY(sq)){printf("顺序队已清空:");PRINT(sq);}break;case 9: printf("感谢使用\n");exit(0);default: printf("input error\n");}}while(1); }六、运行界面菜单功能七、实验中遇到的问题及总结主函数中变量的类型和子函数中类型不匹配,通过不断调试解决了问题。
数据结构上机4_循环队列

实验四队列(循环队列的创建、添加和删除操作)
1.实验目的:掌握循环队列的基本操作,并对其进行简单应用。
2.实验内容:
假设循环队列的最大长度为7,现在依次将以下数据入队列:{7,5,3,9,2,4};
接着进行3次出队列的操作,再将15、18这两个数据入队列,最后从对头到队尾依次输出队列中的元素。
3.实验步骤:
源代码:
运行结果;
4.总结
在C语言中不能用动态分配的一维数组来实现循环队列。
如果用户的应用程序中设有循环队列,则必须为他设定一个最大队列长度;若用户无法预估队列的最大长度,则宜采用链队列。
顺序循环队列实验报告

一、实验目的1. 理解顺序循环队列的概念和原理。
2. 掌握顺序循环队列的初始化、入队、出队等基本操作。
3. 通过编程实现顺序循环队列,并验证其功能。
二、实验原理顺序循环队列是一种利用一维数组实现队列的存储结构。
它将一维数组看作是首尾相连的循环结构,队列的头部和尾部在数组的两端。
顺序循环队列的特点是:队列满时,头指针和尾指针相差一个数组的长度;队列空时,头指针和尾指针相等。
顺序循环队列的基本操作如下:1. 初始化:创建一个顺序循环队列,并设置头指针和尾指针。
2. 入队:将元素插入队列尾部。
3. 出队:从队列头部删除元素。
4. 判断队列是否为空或满。
三、实验内容1. 创建顺序循环队列类。
2. 实现顺序循环队列的初始化、入队、出队等基本操作。
3. 编写测试代码,验证顺序循环队列的功能。
四、实验步骤1. 创建顺序循环队列类,定义队列长度、头指针、尾指针等属性。
2. 实现顺序循环队列的初始化方法,初始化头指针和尾指针。
3. 实现顺序循环队列的入队方法,判断队列是否已满,如果未满,将元素插入队列尾部,并更新尾指针;如果已满,则提示队列已满。
4. 实现顺序循环队列的出队方法,判断队列是否为空,如果为空,则提示队列已空;如果未空,则从队列头部删除元素,并更新头指针。
5. 编写测试代码,创建顺序循环队列实例,执行入队和出队操作,验证顺序循环队列的功能。
五、实验结果与分析1. 初始化顺序循环队列```pythonclass CircularQueue:def __init__(self, size):self.queue = [None] sizeself.head = 0self.tail = 0self.count = 0self.maxsize = size```2. 入队操作```pythondef enqueue(self, item):if self.count == self.maxsize:print("Queue is full")else:self.queue[self.tail] = itemself.tail = (self.tail + 1) % self.maxsizeself.count += 1```3. 出队操作```pythondef dequeue(self):if self.count == 0:print("Queue is empty")else:item = self.queue[self.head]self.queue[self.head] = Noneself.head = (self.head + 1) % self.maxsize self.count -= 1return item```4. 测试代码```pythondef test_circular_queue():queue = CircularQueue(5)print("Enqueue 1 to 5:")for i in range(1, 6):queue.enqueue(i)print(queue.queue)print("Dequeue 1 to 5:")for _ in range(5):print(queue.dequeue())print(queue.queue)test_circular_queue()```实验结果分析:通过测试代码,我们可以看到顺序循环队列在初始化、入队和出队操作时都能正确执行。
数据结构实验4循环队列的实现和运算

数据结构实验4循环队列的实现和运算循环队列是一种特殊的队列,它的特点是可以循环利用已经出队的元
素所占用的空间。
循环队列采用一维数组来实现,通常需要两个指针(称
为队头指针front和队尾指针rear)。
循环队列的基本操作包括初始化、判空、判满、入队、出队、获取队
头元素等。
1. 初始化:循环队列的初始化很简单,只需将队头指针front和队
尾指针rear都置为0即可。
2. 判空:当队头指针front和队尾指针rear相等时,队列为空。
3. 判满:当队尾指针rear加1后等于队头指针front时,队列为满。
4. 入队操作:在插入元素之前,需要判断队列是否已满。
如果队列
为满,则无法插入新的元素;否则,在rear指针的位置插入新的元素,
并将rear指针往后移动一位。
5. 出队操作:在删除元素之前,需要判断队列是否为空。
如果队列
为空,则无法删除元素;否则,在front指针的位置删除元素,并将
front指针往后移动一位。
6. 获取队头元素:获取队列的队头元素很简单,只需返回front指
针位置的元素即可。
循环队列的实现比较简洁高效,主要是通过取模运算来实现队列指针
的循环移动。
当rear指针到达数组的最后一个位置时,再插入新的元素时,需要将rear指针指向数组的第一个位置;当front指针在数组的最
后一个位置上时,再删除元素时,需要将front指针指向数组的第一个位置。
通过循环队列的实现和运算,可以高效地进行队列的操作,从而提高算法的执行效率。
在实际应用中,循环队列常被用于实现缓冲区、进程调度等场景。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验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辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
程序编写提示:以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表实现。
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。
输入数据按到达或离去的时刻有序。
栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。
四、思考与提高
1.链栈只有一个top指针,对于链队列,为什么要设计一个头指针和一个尾指针?
2.一个程序中如果要用到两个栈时,可通过两个栈共享一维数组来实现。
即双向栈共享邻接空间。
如果一个程序中要用到两个队列,能否实现?如何实现?
说明:
三个同学一组,每人完成以下任务之一:
1、队列的链式结构表示与实现;
2、队列的顺序结构表示与实现;
3、约瑟夫环的实现。