实验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指针指向数组的第一个位置。
通过循环队列的实现和运算,可以高效地进行队列的操作,从而提高算法的执行效率。
在实际应用中,循环队列常被用于实现缓冲区、进程调度等场景。
实验四队列的基本操作及应用
实验四队列的基本操作及应用实验时间:第8周实验目的:掌握队列的初始化、判空、取队头元素、出队、入队、输出队列元素等基本操作实验要求:1、认真阅读和掌握教材上和本实验相关的算法。
2、上机将链队列或循环队列的相关算法实现。
3、实现下面实验内容要求的功能,并能够进行简单的输入输出验证。
实验内容:1、必做内容:基本操作部分编程实现链队列或循环队列的基本操作,这些基本操作至少包括:初始化、清空、判空、取队头元素、出队、入队、输出队列元素。
要求能够进行简单的输入输出验证。
2、选做内容:队列应用部分(用队列模拟丹尼斯超市交款处的顾客流)在这一部分,我们使用一个队列模拟一队通过丹尼斯超市交款处的顾客流。
为了创建这个模拟,我们必须模拟排队时间和顾客通过流。
我们可以通过一个循环模拟时间,每通过一个顾客代表一定的时间间隔——例如,一分钟。
我们可以使用一个队列模拟顾客流,队列中的一个数据项代表一位顾客。
为了完成这个模拟,我们需要知道顾客加入交款处队列的频率、交款结算服务情况和离开的频率。
假设交款队列有以下属性。
·每分钟有一个顾客完成交款并离开(假设此时至少有一个顾客等待服务)。
·每分钟有零个到两个顾客加入,没有顾客到达的机会是50% , 一个顾客到达的机会是 25 % ,两个顾客到达的机会是 25 %。
(如何模拟)我们可以使用下面的算法模拟一个时间段 n 分钟内的顾客流。
初始化队列为空。
for (minute = 0 ; minute < n ; + + minute){如果队列不空,队头顾客交款并离开(即出队);产生一个0-3范围内的随机数k;如果k=1,一个顾客加入交款队列(入队);如果k=2,两个顾客加入交款队列(入队);如果k=0或3,不增加任何顾客到交款队列;}调用 rand ( )函数是产生伪随机数的一种简单的方法,rand函数在<stdlib.h>中。
我们的模拟程序应该在每一个模拟分钟期间内更新下列信息,即每一次通过循环。
循环队列的基本操作
注:正面实验题目、实验时间、姓名、学号和专业年级均不写实验目的及要求:了解和掌握循环队列的特点;掌握循环队列基本操作的实现;要求完成循环队列的初始化、入队、出队、求队列长度、显示操作的实现。
实验设备环境及要求:PC机一台,内存要求128M以上,VC++6.0集成开发环境。
实验内容与步骤:1、在VC++6.0环境中新建一个工程和C++文件;2、实现循环队列初始化、入队、出队、求队列长度算法,代码如下:#include <stdio.h>#include <malloc.h>#define MAXQSIZE 5typedef char 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 0;Q.front = Q.rear =0;return 1;}int QueueLength(SqQueue Q){return (Q.rear-Q.front+MAXQSIZE) % MAXQSIZE;}int EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1) % MAXQSIZE == Q.front) {printf("队列为满队列!!\n");return 0;}Q.base[Q.rear] = e;Q.rear = (Q.rear+1) % MAXQSIZE;return 1;}int DeQueue(SqQueue &Q,QElemType &e){ if(Q.front == Q.rear) return 0;e = Q.base[Q.front];Q.front = (Q.front+1) %MAXQSIZE;return 1;}void DispQueue(SqQueue Q){int m,i;m = QueueLength(Q);if(m ==0) printf("该队列为空队列!!\n");for(i = Q.front; i%MAXQSIZE!=Q.rear; i++) printf("%c",Q.base[i]);printf("\n");}void main(){SqQueue Q;QElemType e;InitQueue(Q);DispQueue(Q);EnQueue(Q,'A');EnQueue(Q,'B');EnQueue(Q,'C');EnQueue(Q,'D');printf("队列长度为:");printf("%d\n",QueueLength(Q));printf("队列为:");DispQueue(Q);DeQueue(Q,e);printf("队列长度为:");printf("%d\n",QueueLength(Q));printf("队列为:");DispQueue(Q);EnQueue(Q,'E');printf("队列长度为:");printf("%d\n",QueueLength(Q));printf("队列为:");DispQueue(Q);EnQueue(Q,'F');printf("队列为:");DispQueue(Q);}实验指导与数据处理:实验结果:该队列为空队列!!队列长度为:4队列为:ABCD队列长度为:3队列为: BCD队列长度为:4队列为: BCDE队列为满队列!!队列为: BCDE分析讨论:本次实验通过对循环队列基本操作的实现,加深了对循环队列特点的理解,并且熟悉了VC++6.0集成环境,虽然在调试过程中遇到一些问题,但经分析后达到了预期的结果。
循环队列基本操作的实现
break;
case 4: //输出队头元素
if(GetHead(Q,e))
cout<<"队头元素为:"<<e<<endl;
else
cout<<"当前队列为空队列,没有队头元素"<<endl;
break;
case 5: //输出队尾元素
if(GetTail(Q,e))
}
int main()
{
SqQueue Q; //定义循环队列Q
int k;
char e;
bool flag;
InitQueue(Q); //初始化循环队列Q
cout<<"循环队列Q初始化成功"<<endl;
//循环显示菜单,完成循环队列的一系列操作
do{
showmenu();
cout<<"请选择要执行的操作序号"<<endl;
bool DeQueue(SqQueue &Q,char &e)
{
if(Q.front==Q.rear)
return false;
e = Q.base[Q.front];
Q.front = (Q.front+1)%MAXSIZE;
return true;
}
//取循环队列Q的队头元素,用参数e返回取得的队头元素
bool GetHead(SqQueue Q,char &e)
{
if(Q.front!=Q.rear)
{
e=Q.base[Q.front];
实现循环队列的入队,出队等基本操作
循环队列的基本操作一、实验目的1. 理解并掌握队列的逻辑结构和顺序存储结构,了解循环队列的特点;2. 掌握循环队列中基本操作的相关算法;3. 编程实现相关算法;4. 学会利用循环队列解决实际问题。
二、实验条件Visual C++。
三、实验原理及相关知识1. 循环队列存储结构描述#define MAXSIZ E 100 //最大队列长度typede f struct{QElemT ype *base; //存储空间基址int front; //头指针int rear; //尾指针}SqQueu e;2. 基本操作的算法描述设下标为in dex,队列长度为m,则下一个下标的累进循环计算公式为:index_next= ( index+1 ) % m。
实验中涉及的三个关键操作时循环队列中求队列长度、入队和出队操作。
(1) 求长度所谓求队列长度,即技术队列中元素的个数。
算法思想:根据循环队列的结构特征,可以用公式(Q.rear-Q.front+ MAXSIZ E)%MAXSI Z E直接计算出队列的长度。
算法描述Status QueueL ength(SqQueu e Q){return ( ( Q.rear-Q.front+ MAXSIZ E) %MAXSIZ E);}//QueueL ength(2) 入队入队运算实际上相当于顺序表中的插入运算,所不同的是这里只能在队尾插入元素。
算法思想:①将元素e插入循环队列中队尾元素的下一个存储空间②修改队尾指针,根据循环累计公式计算出其新位置算法描述Status EnQueu e(SqQueu e &Q, QElemT ype e){if ( ( Q.rear + 1 ) % MAXSIZ E == Q.front)return ERROR; //队列满Q.base[Q.rear] = e;Q.rear = ( Q.rear + 1 ) % MAXSIZ E;return OK;}// EnQueu e(3) 出队出队运算实际上相当于顺序表中的删除运算,所不同的是这里只能在队头删除元素。
循环队列的基本操作
循环队列的基本操作循环队列是一种基于数组实现的队列,通过利用数组的循环利用,实现了队列的基本操作。
循环队列主要包括初始化、入队、出队、判空、判满和获取队列长度等操作。
1.初始化循环队列:2.入队操作:入队操作是将元素添加到队列尾部,首先需要判断队列是否已满。
如果队列已满,则入队失败,如果队列未满,则将元素添加到队尾,并将队尾指针rear后移一位。
如果队尾指针已经到达数组末尾,则将队尾指针rear重新设置为0,实现循环利用。
3.出队操作:出队操作是将队头元素删除,并返回该元素的值。
首先需要判断队列是否为空。
如果队列为空,则出队失败,如果队列不为空,则将队头元素返回,并将队头指针front后移一位。
如果队头指针已经到达数组末尾,则将队头指针front重新设置为0。
4.判空操作:判空操作是判断队列是否为空。
当队头指针和队尾指针相等时,队列为空。
5.判满操作:判满操作是判断队列是否已满。
当队尾指针后移一位后,与队头指针相等时,队列已满。
6.获取队列长度:获取队列长度操作是获取循环队列中元素的个数。
循环队列的长度等于rear指针减去front指针,如果rear指针小于front指针,需要加上数组的长度,以实现考虑循环利用后的队列长度。
下面是一个循环队列的基本操作的实现示例:```Pythonclass CircularQueue:def __init__(self, size):self.size = size + 1self.queue = [None] * self.sizeself.front = 0self.rear = 0def enqueue(self, item):if (self.rear + 1) % self.size == self.front:return "Queue is full"self.queue[self.rear] = itemself.rear = (self.rear + 1) % self.sizedef dequeue(self):if self.front == self.rear:return "Queue is empty"item = self.queue[self.front]self.front = (self.front + 1) % self.sizereturn itemdef is_empty(self):return self.front == self.reardef is_full(self):return (self.rear + 1) % self.size == self.frontdef get_length(self):if self.rear >= self.front:return self.rear - self.frontelse:return self.rear - self.front + self.size```循环队列是一种常用的队列实现方式,在实际编程中应用广泛。
循环队列的基本操作
循环队列的基本操作循环队列(Circular Queue)是一种用数组实现的队列数据结构,具有固定大小并按照循环方式使用空间的特点。
循环队列有着基本的操作:入队、出队、判空、判满、获取队头元素、获取队列长度。
1. 入队(Enqueue)操作:入队操作是将元素添加到队列的末尾。
当队列为空时,设置队头和队尾均为0;当队列不满时,将元素插入到队尾,并将队尾指针向后移动一位;当队列满时,不再插入新元素。
算法步骤:1.如果队列已满,返回错误或抛出异常。
2.将元素放入队尾位置。
3.队尾指针向后移动一位(考虑取模操作,以实现循环)。
4.返回成功入队的标志。
2. 出队(Dequeue)操作:出队操作是将队头元素移除,并返回该元素。
当队列为空时,无法进行出队操作。
算法步骤:1.如果队列为空,返回错误或抛出异常。
2.记录队头元素的值。
3.队头指针向后移动一位(考虑取模操作,以实现循环)。
4.返回记录的队头元素值。
3.判空操作:判空操作用于判断队列是否为空。
当队头和队尾指针相等且队列中无元素时,队列为空。
算法步骤:1.如果队头和队尾指针相等,返回队列为空的标志。
2.否则,返回队列不为空的标志。
4.判满操作:判满操作用于判断队列是否已满。
当队头和队尾指针相等且队列中有元素时,队列已满。
算法步骤:1.如果队头和队尾指针相等且队列中有元素,返回队列已满的标志。
2.否则,返回队列未满的标志。
5. 获取队头元素(Get Front):获取队头元素操作用于返回队列中的队头元素,但不移除该元素。
当队列为空时,无法获取队头元素。
算法步骤:1.如果队列为空,返回错误或抛出异常。
2.返回队头指针位置元素的值。
6. 获取队列长度(Get Size):获取队列长度操作用于返回队列中元素的个数。
队列的长度等于队尾指针减去队头指针。
算法步骤:1.返回队尾指针减去队头指针的绝对值。
循环队列的基本操作就是以上六个,它们用于实现循环队列的基本功能。
循环队列的优点是可以更好地利用空间,而不会造成空间浪费。
实验四循环队列基本操作及相关算法的实现
实验四循环队列基本操作及相关算法的实现一、实验目的:掌握循环队列的基本操作及在顺序存储结构上的实现。
二、实验环境:Visual C++6.0三、实验要求:(1)实现队列的顺序存储及基本操作(2)实现两个队列的拼接四、实验步骤:(1)数据结构的定义及实现用结构类型来定义队列的类型#define MaxSize 100 //最大元素个数#define ElemType char#define MaxNumber 100typedef struct //顺序循环队列的类型定义{ ElemType data[MaxSize]; //队列元素存储空间int front; //对头指针int rear; //队尾指针}*CircSeqQueue;#define Apply(pQ) pQ=(CircSeqQueue)malloc(sizeof(CircSeqQueue));(2) 基本操作定义及实现void QueueInitial(CircSeqQueue pQ); //顺序循环队列的初始化int IsEmpty(CircSeqQueue pQ); //顺序循环队列判空int IsFull(CircSeqQueue pQ); //顺序循环队列判满void EnQueue(CircSeqQueue pQ,ElemType e); //元素进队ElemType DeQueue(CircSeqQueue pQ); //元素出队ElemType GetFront(CircSeqQueue pQ); //取队头元素值void display(CircSeqQueue pQ); //遍历队列,并显示void MakeEmpty(CircSeqQueue pQ); //循环队置空void Union(CircSeqQueue pQ1,CircSeqQueue pQ2);//将队列pQ2所指的队列中的元素加到pQ1所指的队列的队尾现具体说顺序栈的元素进队和遍历队列的实现方法,其他的基本操作请参看Queue.cpp 和具体的源程序元素进队:void EnQueue(CircSeqQueue pQ,ElemType e){ //若队列不满,则元素e进队if (IsFull(pQ)) //队列已满,退出{printf("队列溢出!");exit(1);}pQ->rear=(pQ->rear+1)%MaxSize; //队尾指针后移pQ->data[pQ->rear]=e;}void display(CircSeqQueue pQ){if (IsEmpty(pQ)) //如果队列为空,显示空队列{printf("空队列!\n");}while (!IsEmpty(pQ)) //如果不为空,打印队头元素{printf("%-5c",pQ->data[(pQ->front+1)%MaxSize]);pQ->front=(pQ->front+1)%MaxSize; //队头指针向前移一}putchar('\n');}(3) 实现两个队列的拼接,将队列pQ2所指的队列中的元素加到pQ1所指的队列的队尾void Union(CircSeqQueue pQ1,CircSeqQueue pQ2){while (!IsEmpty(pQ2)){EnQueue(pQ1,pQ2->data[(pQ2->front+1)%MaxSize]);//将Q2的队头元素放到Q1尾pQ2->front=(pQ2->front+1)%MaxSize; //Q2的队头指针向下移一位}}(4)主程序流程CircSeqQueue pQ,pQ1,pQ2;Apply(pQ);char d[]={'a','b','c','d','e','f','g','h'};QueueInitial(pQ);for(int i=0;i<=7;i++) EnQueue(pQ,d[i]);printf("\n初始队列元素为:");display(pQ);for(int j=0;j<=7;j++) EnQueue(pQ,d[j]);printf("出队元素为:%c\n",DeQueue(pQ));printf("获取此时的队头元素为:%c\n",GetFront(pQ));printf("将元素m进队后为:");EnQueue(pQ,'m');display(pQ);MakeEmpty(pQ)char d1[]={'x','f','b','m','e'},d2[]="jhxdny";for(int m=0;m<5;m++) EnQueue(pQ1,d1[m]);for(int t=0;t<6;t++) EnQueue(pQ2,d2[t]);Union(pQ1,pQ2);display(pQ1);(5)数据测试及结果分析:经测试结果完全正确,具体结果可以看下面:五总结:由于使用Visual C++来编写程序和对C/C++的语法不够熟悉,所以在调试程序的过程中出现了一些问题。
队列基本操作实验报告
队列基本操作实验报告一、实验目的本次实验的主要目的是通过编写队列的基本操作,掌握队列数据结构的基本原理及其应用。
二、实验内容1. 队列的定义和基本操作队列是一种先进先出(FIFO)的线性数据结构,它只允许在队尾插入元素,在队头删除元素。
队列的基本操作包括:入队(enqueue)、出队(dequeue)、获取队头元素(getFront)、获取队列长度(getSize)等。
2. 队列的顺序存储结构顺序存储结构是指用数组来存储队列中的元素,其中需要维护两个指针:front指向队头元素,rear指向下一个待插入位置。
当rear等于数组长度时,需要进行循环,即将rear置为0。
3. 队列的链式存储结构链式存储结构是指用链表来存储队列中的元素,其中每个节点包含一个数据域和一个指针域。
head指向链表头节点,tail指向链表尾节点。
4. 实验流程(1) 编写顺序存储结构下的队列基本操作函数。
(2) 编写链式存储结构下的队列基本操作函数。
(3) 分别测试两种存储方式下各个函数是否正确实现。
三、实验步骤1. 顺序存储结构下的队列基本操作函数(1) 定义队列结构体和初始化函数。
typedef struct {int *data;int front, rear;int maxSize;} SeqQueue;SeqQueue* initSeqQueue(int maxSize) {SeqQueue *q = (SeqQueue*)malloc(sizeof(SeqQueue));q->data = (int*)malloc(sizeof(int) * maxSize);q->front = q->rear = 0;q->maxSize = maxSize;return q;}(2) 实现入队操作。
bool enqueue(SeqQueue *q, int x) {if ((q->rear + 1) % q->maxSize == q->front) return false; // 队满q->data[q->rear] = x;q->rear = (q->rear + 1) % q->maxSize; // 循环return true;}(3) 实现出队操作。
实验四 队列的基本操作与应用实验报告
入队:Status EnQueue (LinkQueue &Q, QElemType e){ // 插入元素e为Q的新队尾元素p = (QueuePtr) malloc (sizeof (QNode)); //生成新结点if (!p) exit (OVERFLOW); //存储分配失败p->data = e; p->next = NULL; //插入队尾Q.rear->next = p;Q.rear = p; //修改队尾指针指向队尾return OK;}出队:Status DeQueue (LinkQueue &Q, QElemType &e){ // 若队列不空,则删除Q的队头元素,用e 返回其值if (Q.front == Q.rear) return ERROR; //判空p = Q.front->next; e = p->data; //用e返回队头元素值Q.front->next = p->next; //修改头指针始终指向队首元素if (Q.rear == p) Q.rear = Q.front; //特殊情况处理空队free (p); //释放队首结点return OK;}代码一:#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct qnode{ElemType data;struct qnode *next;} QNode;typedef struct{QNode *front;QNode *rear;} LiQueue;void InitQueue(LiQueue *&q);void DestroyQueue(LiQueue *&q);bool QueueEmpty(LiQueue *q);void enQueue(LiQueue *&q, ElemType e);bool deQueue(LiQueue *&q, ElemType &e);void InitQueue(LiQueue *&q)//初始化队列{q = (LiQueue *)malloc(sizeof(LiQueue));q->front = q->rear = NULL;}void DestroyQueue(LiQueue *&q)//销毁队列{QNode *p = q->front, *r;//p指向队头数据节点if (p != NULL)//释放数据节点占用空间{r = p->next;while (r != NULL){free(p);p = r; r = p->next;}}free(p);free(q);//释放链队节点占用空间}bool QueueEmpty(LiQueue *q)//判断队列是否为空{return(q->rear == NULL);}void enQueue(LiQueue *&q, ElemType e)//进队{QNode *p;p = (QNode *)malloc(sizeof(QNode));p->data = e;p->next = NULL;if (q->rear == NULL)//若链队为空,则新节点是队首节点又是队尾节点q->front = q->rear = p;else{q->rear->next = p;//将*p节点链到队尾,并将rear指向它q->rear = p;}}bool deQueue(LiQueue *&q, ElemType &e)//出队{QNode *t;if (q->rear == NULL)//队列为空return false;t = q->front;//t指向第一个数据节点if (q->front == q->rear) //队列中只有一个节点时q->front = q->rear = NULL;else//队列中有多个节点时q->front = q->front->next;e = t->data;free(t);return true;}void main(){ElemType e;LiQueue *q;printf("链队的基本运算如下:\n");printf(" (1)初始化链队q\n");InitQueue(q);printf(" (2)依次进链队元素a,b,c\n");enQueue(q, 'a');enQueue(q, 'b');enQueue(q, 'c');printf(" (3)链队为%s\n", (QueueEmpty(q) ? "空" : "非空"));if (deQueue(q, e) == 0)printf("\t提示:队空,不能出队\n");elseprintf(" (4)出队一个元素%c\n", e);printf(" (5)依次进链队元素d,e,f\n");enQueue(q, 'd');enQueue(q, 'e');enQueue(q, 'f');printf(" (6)出链队序列:");while (!QueueEmpty(q)){deQueue(q, e);printf("%c ", e);}printf("\n");printf(" (7)释放链队\n");DestroyQueue(q);}代码二:#include <stdio.h>#include <malloc.h>typedef struct qnode{int data;struct qnode *next;} QNode;//链队节点类型typedef struct{QNode *front, *rear;} QuType;//链队类型void Destroyqueue(QuType *&qu)//释放链队{QNode *p, *q;p = qu->front;if (p != NULL)//若链队不空{q = p->next;while (q != NULL)//释放队中所有的节点{free(p);p = q;q = q->next;}free(p);}free(qu);//释放链队节点}void SeeDoctor(){int sel, flag = 1, find, no;QuType *qu;QNode *p;qu = (QuType *)malloc(sizeof(QuType));//创建空队qu->front = qu->rear = NULL;while (flag == 1) //循环执行{printf("1:排队2:就诊3:查看排队4.不再排队,余下依次就诊5:下班请选择:");scanf("%d", &sel);switch (sel){case 1:printf(" >>输入病历号:");do{scanf("%d", &no);find = 0;p = qu->front;while (p != NULL && !find){if (p->data == no)find = 1;elsep = p->next;}if (find)printf(" >>输入的病历号重复,重新输入:");} while (find == 1);p = (QNode *)malloc(sizeof(QNode));//创建节点p->data = no; p->next = NULL;if (qu->rear == NULL)//第一个病人排队qu->front = qu->rear = p;else{qu->rear->next = p; qu->rear = p;//将*p节点入队}break;case 2:if (qu->front == NULL)//队空printf(" >>没有排队的病人!\n");else//队不空{p = qu->front;printf(" >>病人%d就诊\n", p->data);if (qu->rear == p)//只有一个病人排队的情况qu->front = qu->rear = NULL;elsequ->front = p->next;free(p);}break;case 3:if (qu->front == NULL) //队空printf(" >>没有排列的病人!\n");else //队不空{p = qu->front;printf(" >>排队病人:");while (p != NULL){printf("%d ", p->data);p = p->next;}printf("\n");}一:二:总结体会:通过本次实验掌握了链式存储队列的进队和出队等基本操作,通过这些基本操作,我对队列问题有了更深的理解,能够正确理解队列问题及其使用。
循环队列的基本操作及实现
循环队列的基本操作及实现循环队列是一种特殊的队列,它可以充分利用数组空间,实现队列的基本操作。
循环队列的基本操作包括入队、出队、判断队列是否为空、判断队列是否已满等。
1. 入队操作入队操作是将元素插入队列尾部的操作。
在循环队列中,需要考虑队列已满的情况。
当队列已满时,需要将队列头部的元素出队,然后再将新元素入队。
入队操作的代码如下:```void enqueue(int data) {if ((rear + 1) % MAX_SIZE == front) {dequeue();}queue[rear] = data;rear = (rear + 1) % MAX_SIZE;}```2. 出队操作出队操作是将队列头部的元素删除的操作。
在循环队列中,需要考虑队列为空的情况。
当队列为空时,无法进行出队操作。
出队操作的代码如下:```int dequeue() {if (front == rear) {return -1;}int data = queue[front];front = (front + 1) % MAX_SIZE;return data;}```3. 判断队列是否为空判断队列是否为空的操作是判断队列中是否还有元素的操作。
在循环队列中,队列为空的条件是队列头部和队列尾部相等。
判断队列是否为空的代码如下:```bool is_empty() {return front == rear;}```4. 判断队列是否已满判断队列是否已满的操作是判断队列中是否还有空间可以插入元素的操作。
在循环队列中,队列已满的条件是队列头部和队列尾部相邻。
判断队列是否已满的代码如下:```bool is_full() {return (rear + 1) % MAX_SIZE == front;}```循环队列的实现可以使用数组来实现,也可以使用链表来实现。
使用数组实现循环队列时,需要定义一个数组和两个指针,分别指向队列头部和队列尾部。
数据结构 实验4 循环队列的实现和运算
}
5、测试数据与实验结果(可以抓图粘贴)(1)菜单显示:
(2)入队:
(3)队满(已入队9个元素):
(4)出队:
(5)队空(已出队9个元素):
(6)显示队中的元素:
(7)求队长:
6、结果分析与实验体会
本次实验是参考了范例程序,经过自己的改写,从而实现要求。
先做简单的输出,一步步的再做其它格式的设置。
在实验的过程中,我加深了对队列各种操作的理解,因为队列是“先进先出”的操作受限制的线性表,一般队列只允许在队尾进行插入操作,在队头进行删除操作,元素之间存在一对一的关系,本程序的设计过程也是对前面线性表知识的巩固。
再者,用链式存储结构实现这个程序,实际上是设计一个带有头指针(front)和尾指针(rear)的单向链表,此单向链表没有头结点,头尾指针指的是同一个单向链表中的首尾结点,所以,从链队列的整体结构考虑,一般讲这两个指针封装在一个结构体中。
队列是一种应用广泛的数据结构,凡具有其特点的需要排队处理的问题,都可以使用它来处理。
- 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、约瑟夫环的实现。