循环队列Circular Queue

循环队列:先进先出,从头出:front+1,从尾进:rear+1,空判断:front==rear,满判断(rear+1)%maxsize==front

//循环队列的实现

//定义队列结构体

define MAXSIZE 100

typedef struct
{
int *base; //存储内存分配基地址
int front; //队列头索引
int rear; //队列尾索引
}circularQueue;

//队列初始化
void InitQueue(circularQueue *q)
{
q->base = (int *)malloc((MAXSIZE) * sizeof(int));
if(NULL == q->base) exit(0);
q->front = q->rear = 0;
}

//入队队列
void InsertQueue(circularQueue *q, int e)
{
if((q->rear+1)%MAXSIZE == q->front) return; //队已满
q->base[q->rear] = e;
q->rear = (q->rear+1%)MAXSIZE; //尾部指向下一个空间位置,取模保证索引不越界(余数一定小于除数)
}

//出队列
void DeleteQueue(circularQueue *q, int *e)
{
if((q->front==q->end)) return;
*e = q->base[q->front];
q->front = (q->front+1)%MAXSIZE;
}

原文地址:https://www.cnblogs.com/embeddedking/p/9691981.html

时间: 2024-10-13 05:01:47

循环队列Circular Queue的相关文章

循环队列(Circular Queue)

循环队列(Circular Queue) 1. 循环队列的概念 1.1 循环队列的定义 为了能够充分地使用数组中的存储空间,克服"假溢出"现象,可以把数组的前端和后端连接起来,形成一个环形的表,即把存储队列元素的表从逻辑上看成一个环,成为循环队列(circular queue). 1.2 循环队列中各元素的逻辑及存储关系 循环队列的首尾相接,当队头指针front和队尾指针rear进到maxSize-1后,再前进一个位置就自动到0.这可以利用除法取余的运算(%)来实现. (1)队头指针进

Circular Queue--循环队列

队列大家见得很多了,形式也比较简单,就是一个特化的链表,它的enqueue.dequeue操作相当于链表的addLast.removeFirst操作.关于链表的实现,可以查看我的另一篇博文--"LinkedList--链表".下面仅讨论一个稍微复杂点的情况--循环队列. 循环队列的就是用循环数组来实现队列,有一个问题需要解决:在普通的非循环队列中,rear == front 说明队列为空队列,然而在循环队列中,这个可能意味着队列为空,也可能意味着队列为满.通常采用两种策略来处理这个问题

[LeetCode] Design Circular Queue 设计环形队列

Design your implementation of the circular queue. The circular queue is a linear data structure in which the operations are performed based on FIFO (First In First Out) principle and the last position is connected back to the first position to make a

C# 编程中的堆栈(Stack)和队列(Queue)

一.什么是堆?(Heap)      堆是无序的,是一片不连续的内存域,由用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收.      是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小. 二.什么是栈?(Stack)      栈是有顺序的,是一片连续的内存域,保持着先进后出的原则,由系统自动分配和维护.      是编译期间就分配好的内存空间,因此代码中必须就栈的大小有明确的定义.      表尾允许进行插入

数据结构-队列(2)-循环队列

循环队列 此前,我们提供了一种简单但低效的队列实现. 更有效的方法是使用循环队列. 具体来说,我们可以使用固定大小的数组和两个指针来指示起始位置和结束位置. 目的是重用我们之前提到的被浪费的存储. 设计循环队列 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器".循环队列的一个好处是我们可以利用这个队列之前用过的空间.在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即

622.设计循环队列

设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器". 循环队列的一个好处是我们可以利用这个队列之前用过的空间.在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间.但是使用循环队列,我们能使用这些空间去存储新的值. 你的实现应该支持如下操作: MyCircularQueue(k): 构造器,设置队列长度为 k . Front: 从队首获取元素.如果队

设计循环队列——写起来最清爽的还使用原生的deque 双端队列

622. 设计循环队列 难度中等89收藏分享切换为英文关注反馈 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为“环形缓冲器”. 循环队列的一个好处是我们可以利用这个队列之前用过的空间.在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间.但是使用循环队列,我们能使用这些空间去存储新的值. 你的实现应该支持如下操作: MyCircularQueue(k): 构造器,设置队

数据结构之循环队列c语言实现

    队列是一种先入先出的结构,数据从队列头出,队尾进.在linux内核中进程调度,打印缓冲区都有用到队列.     队列有多种实现方式,可以用链表,也可以用数组.这里用数组来实现一个简单的循环队列.首先创建一个大小为8的队列如下,队列头尾指针指向同一块内存,          当从队列尾部插入一个数据后变成下面的情形,为了便于处理,这里始终会浪费一个空间 继续插入数据,直到出现以下情形,表示队列满了, 接下来看一下出队的情形,从队列头出队3个元素, 再添加三个元素后队列又变成满的了, 在上面

47 _ 循环队列程序演示.swf

通过上面的分析我们已经对循环队列很了解了,现在我们来学习下循环队列的实现形式 1.代码使用数组现实循环队列 #include<stdio.h> #include<malloc.h> #include <stdio.h> #include <stdlib.h> typedef struct Queue{ int * data;//存储的数据,指向一个数组 int font ;//队列数据删除 int rear;//队列数据的添加 }QUEUE ,*PQUEUE