C语言--循环队列测试长度用源文件-CycQueueTest.c

合集下载

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

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

循环队列的学习解析以及C语言实现首先我们先来了解一下队列的概念:队列是一种先进先出的线性表只能在表头删除在表尾插入,操作系统的作业队列就是队列的一个很好的应用。

也有可以在两端均可进行插入和删除操作的队列,称为双端队列,但其用处并没有一般队列广泛。

ADT Queue {数据对象:D={ai | ai∈ElemSet, i=1,2,...,n, n≥0} 数据关系:R1={ <a i-1,ai > | 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 分别指示队列头元素和队列的尾元素的位置。

c b a 5 4 3 2 1 0 Q.rear →Q.fron → Q.rea → Q.fron→(1)空队列 (2)a,b,,c 相继入队由于顺序队列所分配的空间有限,根据队列入队和出队的特点可能发生“假溢出”现象,即队尾元素无法在前移。

解决的办法就是将队列抽象成为环状,即循环队列。

循环队列以下是循环队列的几种主要的操作以及C 语言实现:/********循环队列的数据结构***********/#define MAXQSIZE 10typedef struct{QElemType *base;int front;int rear; { 队空条件:Q.front=Q.rear队满条件:(Q.rear+1)%MAXQSIZE} SqQueue;1、循环队列的初始化Status InitQueue(SqQueue &Q){ //构建一个空队列Q.base = new QElemType[MAXQSIZE];if( Q.base = NULL) //存储分配失败exit(OVERFLOW) ;Q.front = Q.rear = 0; //头尾指针置为零,队列为空return OK;}2、求循环队列长度int QueueLength(Squeue Q){return (Q.rear - Q.front + MAXQSIZE )%MAXQSIZE; }3、入队Status EnQueue (SqQueue &Q , QElemType e){if((Q.rear+1)%MAXQSIZe == Q.front)return ERROW;Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) %MAXQSIZE;return OK:}4、出队Status DeQueue(SqQueue &Q,QElemType &e)if(Q.front==Q.rear)return ERROW;e=Q.base[Q.front];Q.front = (Q.front + 1 )%MAXQSIZE; return OK;}5、取队头元素SElemType GetHead(SqQueue Q) {if(Q.front ! = Q.rear)return Q.base[Q.front];}队列的链式表示和实现。

c语言queue函数用法

c语言queue函数用法

c语言queue函数用法C语言中的queue函数是一个非常有用的数据结构,用于表示先进先出(FIFO)的队列。

它被广泛应用于许多领域,例如操作系统、网络通信和计算机游戏等。

在本文中,我们将介绍C语言queue函数的详细用法,希望能够帮助初学者更好地掌握这个工具。

首先,我们需要了解queue函数的基本语法。

在C语言中,queue函数是作为一个标准库函数来实现的。

要使用它,我们需要包含“<queue.h>”头文件,并使用“queue”类型来定义一个队列变量。

例如:#include <queue.h>queue<int> myQueue;在这里,我们定义了一个名为“myQueue”的整型队列。

请注意,<queue.h>头文件也提供了对其他类型(如字符、浮点数等)的队列支持。

接下来,我们将介绍queue函数的常用操作。

与其他数据结构一样,队列的主要操作包括入队(push)、出队(pop)、获取队首元素(front)和队列是否为空(empty)。

以下示例代码将演示如何使用这些操作:// 将数字1-5添加到队列中for(int i=1; i<=5; i++) {myQueue.push(i);}// 输出队列的大小cout << "队列大小:" << myQueue.size() << endl;// 弹出队首元素并输出cout << "队首元素:" << myQueue.front() << endl; myQueue.pop();// 队列是否为空if (myQueue.empty()) {cout << "队列为空" << endl;}在这个例子中,我们首先使用push操作将数字1-5添加到队列中。

C语言循环队列的表示与实例详解

C语言循环队列的表示与实例详解

C语言循环队列的表示与实例详解C语言循环队列的表示与实例详解1.概述:C语言的队列(queue),是先进先出(FIFO, First-In-First-Out)的线性表数据结构。

在具体应用中通常用链表或者数组来实现。

队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。

循环队列可以更简单的防止伪溢出的发生,但是队列大小是固定的。

2.实例代码:/* 队列的顺序存储结构(循环队列) */#define MAX_QSIZE 5 /* 最大队列长度+1 */typedef struct{ QElemType *base; /* 初始化的动态分配存储空间*/ int front; /* 头指针,若队列不空,指向队列头元素*/ int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置*/}SqQueue;/* 循环队列的基本操作(9个) */void InitQueue(SqQueue *Q){ /* 构造一个空队列Q */ Q->base=malloc(MAX_QSIZE*sizeof(QElemType)); if(!Q->base) /* 存储分配失败 */ exit(OVERFLOW); Q->front=Q->rear=0;}void DestroyQueue(SqQueue *Q){ /* 销毁队列Q,Q不再存在*/ if(Q->base) free(Q->base); Q->base=NULL; Q->front=Q->rear=0;}void ClearQueue(SqQueue *Q){ /* 将Q清为空队列 */ Q->front=Q->rear=0;}Status QueueEmpty(SqQueue Q){ /* 若队列Q为空队列,则返回TRUE;否则返回FALSE */ if(Q.front==Q.rear) /* 队列空的标志*/ return TRUE; else return FALSE;}int QueueLength(SqQueue Q){ /* 返回Q的元素个数,即队列的'长度*/ return(Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;}Status GetHead(SqQueue Q,QElemType *e){ /* 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR */ if(Q.front==Q.rear) /* 队列空 */ returnERROR; *e=Q.base[Q.front]; return OK;}Status EnQueue(SqQueue *Q,QElemType e){ /* 插入元素e为Q的新的队尾元素*/ if((Q->rear+1)%MAX_QSIZE==Q->front) /* 队列满*/ return ERROR; Q->base[Q->rear]=e; Q->rear=(Q->rear+1)%MAX_QSIZE; return OK;}Status DeQueue(SqQueue *Q,QElemType *e){ /* 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR */ if(Q->front==Q->rear) /* 队列空*/ return ERROR; *e=Q->base[Q->front]; Q->front=(Q->front+1)%MAX_QSIZE; return OK;}void QueueTraverse(SqQueue Q,void(*vi)(QElemType)){ /* 从队头到队尾依次对队列Q中每个元素调用函数vi() */ int i; i=Q.front; while(i!=Q.rear) { vi(Q.base[i]); i=(i+1)%MAX_QSIZE; } printf("n");}。

数据结构:循环队列(C语言实现)

数据结构:循环队列(C语言实现)

数据结构:循环队列(C语言实现)生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题;从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构。

队列分为链式队列和静态队列;静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。

这里讲的是循环队列,首先我们必须明白下面几个问题一、循环队列的基础知识1.循环队列需要几个参数来确定循环队列需要2个参数,front和rear2.循环队列各个参数的含义(1)队列初始化时,front和rear值都为零;(2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置;(3)当队列为空时,front与rear的值相等,但不一定为零;3.循环队列入队的伪算法(1)把值存在rear所在的位置;(2)rear=(rear+1)%maxsize ,其中maxsize代表数组的长度;程序代码:[cpp]view plaincopy1.bool Enqueue(PQUEUE Q, int val)2.{3.if(FullQueue(Q))4.return false;5.else6. {7. Q->pBase[Q->rear]=val;8. Q->rear=(Q->rear+1)%Q->maxsize;9.return true;10. }11.}4.循环队列出队的伪算法(1)先保存出队的值;(2)front=(front+1)%maxsize ,其中maxsize代表数组的长度;程序代码:[cpp]view plaincopy1.bool Dequeue(PQUEUE Q, int *val)2.{3.if(EmptyQueue(Q))4. {5.return false;6. }7.else8. {9. *val=Q->pBase[Q->front];10. Q->front=(Q->front+1)%Q->maxsize;11.return true;12. }13.}5.如何判断循环队列是否为空if(front==rear)队列空;else队列不空;[cpp]view plaincopy1.bool EmptyQueue(PQUEUE Q)2.{3.if(Q->front==Q->rear) //判断是否为空4.return true;5.else6.return false;7.}6.如何判断循环队列是否为满这个问题比较复杂,假设数组的存数空间为7,此时已经存放1,a,5,7,22,90六个元素了,如果在往数组中添加一个元素,则rear=front;此时,队列满与队列空的判断条件front=rear相同,这样的话我们就不能判断队列到底是空还是满了;解决这个问题有两个办法:一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是,少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满;[cpp]view plaincopy1.bool FullQueue(PQUEUE Q)2.{3.if(Q->front==(Q->rear+1)%Q->maxsize) //判断循环链表是否满,留一个预留空间不用4.return true;5.else6.return false;7.}附录:queue.h文件代码:[cpp]view plaincopy1.#ifndef __QUEUE_H_2.#define __QUEUE_H_3.typedef struct queue4.{5.int *pBase;6.int front; //指向队列第一个元素7.int rear; //指向队列最后一个元素的下一个元素8.int maxsize; //循环队列的最大存储空间9.}QUEUE,*PQUEUE;10.11.void CreateQueue(PQUEUE Q,int maxsize);12.void TraverseQueue(PQUEUE Q);13.bool FullQueue(PQUEUE Q);14.bool EmptyQueue(PQUEUE Q);15.bool Enqueue(PQUEUE Q, int val);16.bool Dequeue(PQUEUE Q, int *val);17.#endifqueue.c文件代码:[cpp]view plaincopy1.#include<stdio.h>2.#include<stdlib.h>3.#include"malloc.h"4.#include"queue.h"5./***********************************************6.Function: Create a empty stack;7.************************************************/8.void CreateQueue(PQUEUE Q,int maxsize)9.{10. Q->pBase=(int *)malloc(sizeof(int)*maxsize);11.if(NULL==Q->pBase)12. {13. printf("Memory allocation failure");14. exit(-1); //退出程序15. }16. Q->front=0; //初始化参数17. Q->rear=0;18. Q->maxsize=maxsize;19.}20./***********************************************21.Function: Print the stack element;22.************************************************/23.void TraverseQueue(PQUEUE Q)24.{25.int i=Q->front;26. printf("队中的元素是:\n");27.while(i%Q->maxsize!=Q->rear)28. {29. printf("%d ",Q->pBase[i]);30. i++;31. }32. printf("\n");33.}34.bool FullQueue(PQUEUE Q)35.{36.if(Q->front==(Q->rear+1)%Q->maxsize) //判断循环链表是否满,留一个预留空间不用37.return true;38.else39.return false;40.}41.bool EmptyQueue(PQUEUE Q)42.{43.if(Q->front==Q->rear) //判断是否为空44.return true;45.else46.return false;47.}48.bool Enqueue(PQUEUE Q, int val)49.{50.if(FullQueue(Q))51.return false;52.else53. {54. Q->pBase[Q->rear]=val;55. Q->rear=(Q->rear+1)%Q->maxsize;56.return true;57. }58.}59.60.bool Dequeue(PQUEUE Q, int *val)61.{62.if(EmptyQueue(Q))63. {64.return false;65. }66.else67. {68. *val=Q->pBase[Q->front];69. Q->front=(Q->front+1)%Q->maxsize;70.return true;71. }72.}[文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!]。

循环队列的基本操作

循环队列的基本操作

循环队列的基本操作循环队列是一种基于数组实现的队列,通过利用数组的循环利用,实现了队列的基本操作。

循环队列主要包括初始化、入队、出队、判空、判满和获取队列长度等操作。

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```循环队列是一种常用的队列实现方式,在实际编程中应用广泛。

循环队列的长度计算公式

循环队列的长度计算公式

循环队列的长度计算公式循环队列是一种常用的数据结构,它具有固定长度且能够实现高效的插入和删除操作。

在进行循环队列的操作时,需要了解循环队列的长度计算公式,以便正确地进行相关操作。

循环队列的长度计算公式如下:长度 = (rear - front + maxSize) % maxSize其中,rear表示队尾指针,front表示队头指针,maxSize表示队列的最大长度。

循环队列的长度计算公式的推导如下:1. 队列为空时,队头指针front和队尾指针rear指向同一个位置,即front = rear。

此时队列的长度为0,符合计算公式。

2. 当往队列中插入一个元素时,队尾指针rear向后移动一位,即rear = (rear + 1) % maxSize。

队列的长度增加1,符合计算公式。

3. 当从队列中删除一个元素时,队头指针front向后移动一位,即front = (front + 1) % maxSize。

队列的长度减少1,符合计算公式。

4. 当队列满时,队尾指针rear与队头指针front相邻,即(rear + 1) % maxSize = front。

此时队列已满,无法再插入元素,队列的长度为maxSize,符合计算公式。

循环队列的长度计算公式能够正确地计算队列的长度,不论是插入元素还是删除元素都能够准确地反映队列的变化情况。

循环队列的长度计算公式的应用场景很广泛。

在实际应用中,循环队列常用于实现缓冲区、任务调度等场景。

例如,在操作系统中,循环队列可以用于实现进程调度的就绪队列,通过计算队列的长度可以判断系统的负载情况,从而决定是否需要调度新的进程。

在网络传输中,循环队列可以用于实现滑动窗口,通过计算队列的长度可以判断网络的拥塞情况,从而调整传输速率。

循环队列是一种非常实用的数据结构,通过循环队列的长度计算公式可以准确地获取队列的长度。

了解循环队列的长度计算公式对于正确地使用循环队列非常重要,能够帮助我们更好地理解和应用循环队列。

数据结构(C语言版)循环队列

数据结构(C语言版)循环队列

一、实验目的:1、掌握队列的特点及其描述方法;2、用顺序循环结构实现一个队列;3、掌握队列的各种基本操作。

二、实验内容:1、设计一个循环队列;2、编写队列的入队、出队、读队头元素、显示队列中全部元素的程序;3、设计一个选择式菜单,以菜单方式选择队列的各种基本操作。

#include "stdafx.h"#include "iostream.h"#include "stdio.h"const int MAXLEN=10;typedef struct{int data[MAXLEN];int front,rear;}SeQueue;SeQueue InitSeQueue(){SeQueue q;q.front=-1;q.rear=-1;return(q);}int Getfront_seq(SeQueue *q,int *x){if(q->front==q->rear)return(0);else{*x=q->data[(q->front)+1];return(1);}}int enterSeQueue(SeQueue *q,int x) {if(q->rear==MAXLEN-1)return(0);elseq->rear++;q->data[q->rear]=x;return(1);}int DelSeQueue(SeQueue *q,int *x) {if(q->front==q->rear)return(0);else{q->front++;*x=q->data[q->front];return(1);}}int Empty_seq(SeQueue *q){return(q->rear==q->front);}void print(SeQueue q){int n;if(q.front!=q.rear){printf("队列的元素输出:");for(n=q.front+1;n<=q.rear;n++)printf("%3d",q.data[n]);}elseprintf("队列为空!!!");printf("\n");}int main(int argc, char* argv[]){int x;SeQueue queue;int n,y,z,i,j;queue=InitSeQueue();cout<<"蔡勇超广东海洋大学寸金学院11信息管理与信息系统2班"<<endl;cout<<"联系方式:13763**** 77532****@."<<endl;cout<<"程序设计一般原则自顶向下,逐步细化,先设计外部接口,再进行内部设计。

循环队列c语言代码

循环队列c语言代码

循环队列c语言代码循环队列是一种非常重要的数据结构,它可以有效地解决一些实际问题中的困扰。

本文将从什么是循环队列、循环队列的实现原理及代码示例、循环队列的应用场景等方面,给大家介绍循环队列。

循环队列是一种特殊的队列,它的特点是队尾指针指向数组的末尾,而队头指针指向数组的开头。

当队列的元素个数达到数组的长度时,队尾指针循环回到数组开头,实现了循环的效果。

这样一来,我们就可以充分利用数组的空间,提高空间利用率。

循环队列的实现原理非常简单。

首先,我们需要定义一个数组和两个指针,分别指向队头和队尾。

然后,根据具体需求实现入队和出队的操作。

入队时,我们先检查队列是否已满,如果满了则返回错误;否则,将元素插入到队尾指针所指向的位置,并将队尾指针往后移动一位。

出队时,我们先检查队列是否为空,如果为空则返回错误;否则,将队头指针所指向的元素删除,并将队头指针往后移动一位。

下面是循环队列的C语言代码示例:```cdefine MAX_SIZE 10 // 定义循环队列的最大长度typedef struct {int data[MAX_SIZE];int front;int rear;} CircularQueue;// 初始化循环队列void initCircularQueue(CircularQueue* queue) {queue->front = 0;queue->rear = 0;}// 判断循环队列是否为空int isEmpty(CircularQueue* queue) {return queue->front == queue->rear;}// 判断循环队列是否已满int isFull(CircularQueue* queue) {return (queue->rear + 1) % MAX_SIZE == queue->front; }// 入队操作int enqueue(CircularQueue* queue, int value) {if (isFull(queue)) {return 0; // 队列已满,插入失败}queue->data[queue->rear] = value;queue->rear = (queue->rear + 1) % MAX_SIZE; // 循环移动队尾指针return 1; // 插入成功}// 出队操作int dequeue(CircularQueue* queue, int* value) {if (isEmpty(queue)) {return 0; // 队列为空,删除失败}*value = queue->data[queue->front];queue->front = (queue->front + 1) % MAX_SIZE; // 循环移动队头指针return 1; // 删除成功}```循环队列在实际应用中有着广泛的应用场景。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档