循环队列

数据结构之队列

こ雲淡風輕ζ 提交于 2020-02-26 06:22:14
文章来源: http://blog.seclibs.com/数据结构之队列/ 上一篇文章说了一种“功能受限”的顺序表——栈,现在再来说一个 “功能受限”的顺序表 —— 队列 (queue)。 队列也是一个常用的数据结构,在大部分资源有限的情况下,当没有空闲资源的时候,基本上都是使用队列这种数据结构来实现请求排队的。 队列,顾名思义,就是排的一条队,比如在买票的时候排的一条队伍,先来的先买,后来的后买,不允许插队,也就是先进先出的方式,栈是后进先出的方式。 栈支持入栈(push)和出栈(pop)两种操作,队列也是类似的,支持入队(enqueue)和出队(dequeue)两种操作,入队就是在尾部追加一个数据,出队就是在头部取走一个数据。 队列作为一种非常基础的数据结构,应用是非常广泛的,特别是一些具有某些额外特性的队列,比如循环队列、阻塞队列、并发队列。它们在很多偏底层系统、框架、中间件的开发中,起着关键性的作用。 队列在实现上跟栈也是类似的,可以使用数组或链表来进行实现,使用数组实现的叫做顺序队列,使用链表实现的叫做链式队列。但是栈只需要一个栈顶指针top就可以了,队列则需要头部head指针和尾部tail指针两个来标识。 比如说a、b、c、d四个数据入队以后,head指针将指向下标为0的位置,tail指针指向下标为4的位置 当进行两次出队的操作后,head指针将指向下标为2的位置

循环队列(c语言)

限于喜欢 提交于 2020-02-25 18:16:58
  在循环队列中,Q->front==Q->rear 并不能确定队列为空,也有可能是队列已满,所以采用“队列头指针在队列尾指针的下一位置”来判断队列已满(此方法会浪费一个内存空间)。 《数据结构(C语言版)[严蔚敏_吴伟民]》中63页有讲解。   此程序,在书中例子的基础上,增加了内存空间不足的重新分配。 define.h 1 // define.h 2 #ifndef __MENGQL_DEFINE__ 3 #define __MENGQL_DEFINE__ 4 5 #define C_LOG_DBG(format, ...) 6 //printf("[%s@%s,%d] " format ,__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); 7 #define C_LOG_ERR(format, ...) printf("[%s@%s,%d] " format ,__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); 8 typedef enum EStatus {ERROR, OK} Status; 9 10 #endif SqQueue.h 1 // SqQueue.h 2 #ifndef __SQ_QUEUE_H__ 3 #define __SQ_QUEUE_H__ 4 5

数据结构:队列的顺序存储结构(循环队列)

丶灬走出姿态 提交于 2020-02-25 15:43:13
队列的定义: 队列是只允许在一端进行插入操作,而在另一端进行删除操作的 线性表 。 队列的抽象数据类型: ADT 队列(Queue) Data 同线性表,元素具有相同的类型,相邻元素具有前驱和后继关系。 Operation InitQueue(*Q): 初始化操作,建立一个空队列。 DestroyQueue(*Q): 若队列Q存在,则销毁它。 ClearQueue(*Q): 将队列清空。 QueueEmpty(Q): 判断队列是否为空。 GetHead(Q,*e): 若队列存在且非空,用e返回Q的队头元素。 EnQueue(*Q,e): 若队列Q存在,插入新元素e到队列Q中并成为队尾元素。 DeQueue(*Q,*e): 删除队列中的队头元素,并用e返回。 QueueLength(Q): 返回队列Q的元素的个数。 endADT 线性表有顺序存储和链式存储,栈是线性表,所以有这两种存储方式,有顺序栈和链栈。同样队列作为一种特殊的线性表,也存在这两种存储方式。先来看队列的顺序存储结构。 队列的顺序存储结构同线性表的顺序存储结构存在着同样的问题,队头出队列要后面的元素依次向前移动,时间复杂度为O(n)。 因为队列的每次删除元素都是从队头,所以每次删除都有大量的元素要移动,这样算法的效率很不好。于是改进一下,队头不一定要在数组的下标为0的位置。也就是说删除一个元素

循环队列(普通+双端)

こ雲淡風輕ζ 提交于 2020-02-24 20:18:45
一、普通循环队列 1、普通循环队列明细 循环队列是针对 顺序队列中最大化利用内存空间 的一种解决方法,可以解决当队列(数组)不可再插入新元素但队列的实际可用空间并未占满的问题。 相比普通的队列, 多了个指向队头的索引 ,而且也是只能在头部删除元素,尾部插入元素。故删除元素的时候,该索引需要往后走一个位置(取模)。插入元素还是队尾插入(取模)。 public class CircleQueue < E > { private int size = 0 ; private int front ; private E [ ] elements ; private final int DEFAULT_CAPACITY = 10 ; public CircleQueue ( ) { elements = ( E [ ] ) new Object [ DEFAULT_CAPACITY ] ; front = 0 ; } public boolean isEmpty ( ) { return size == 0 ; } public void offer ( E element ) { ensureCapacity ( size + 1 ) ; elements [ ( front + size ) % elements . length ] = element ; /

另类循环队列

老子叫甜甜 提交于 2020-02-21 06:33:18
bool AddQ ( Queue Q , ElementType X ) { if ( Q -> Count == Q -> MaxSize ) { printf ( "Queue Full\n" ) ; return false ; } else { Q -> Data [ Q -> Count + Q -> Front ] = X ; Q -> Count ++ ; } } ElementType DeleteQ ( Queue Q ) { if ( Q -> Count == 0 ) { printf ( "Queue Empty\n" ) ; return ERROR ; } else { int t = Q -> Data [ Q -> Front ] ; Q -> Front ++ ; Q -> Count -- ; return t ; } } 用元素加front推就行了,注意删除队列的时候count减1就ok。 来源: CSDN 作者: 性感程序员 链接: https://blog.csdn.net/qq_40447680/article/details/104417289

leetcode -- 622、641

痞子三分冷 提交于 2020-02-16 14:19:17
文章目录 622.设计循环队列 题目描述 解题方法 641.设计循环双端队列 题目描述 解题思路 622.设计循环队列 题目描述 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实现应该支持如下操作: MyCircularQueue(k): 构造器,设置队列长度为 k 。 Front: 从队首获取元素。如果队列为空,返回 -1 。 Rear: 获取队尾元素。如果队列为空,返回 -1 。 enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。 deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。 isEmpty(): 检查循环队列是否为空。 isFull(): 检查循环队列是否已满。 示例: MyCircularQueue circularQueue = new MycircularQueue(3); // 设置长度为 3 circularQueue.enQueue(1); // 返回 true circularQueue.enQueue

Leetcode——622. 设计循环队列

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-14 18:00:06
这里用变量qsize来指示队列中含有多少个元素,判断队列满或空。在编码的时候要注意数组下标的边界就好了。 注意一点:自己因为很长时间不写c++对c++的语法不是很熟了,新建一个动态int数组为new int[length_of_the_array] 而 new int(int_value)是new一个int数,值为int_value,让我找了好长时间才发现这个错误555. class MyCircularQueue { public : int head ; int rear ; int num ; int qsize ; int * qu ; /** Initialize your data structure here. Set the size of the queue to be k. */ MyCircularQueue ( int k ) { head = 0 ; rear = 0 ; qsize = 0 ; num = k ; qu = new int [ k ] ; } /** Insert an element into the circular queue. Return true if the operation is successful. */ bool enQueue ( int value ) { if ( qsize == num ) {

【原创】循环队列存储数据

拜拜、爱过 提交于 2020-02-13 02:13:05
  项目对数据存储和获取有一定的要求,循环队列能解决我的问题,上网查相关的资料,重新了解了一下循环队列。   在编写代码的时候尤其需要注意循环队列数组超出下界的情况,而且有一点得说明的是循环队列在初始化的时候指向对头的前指针Front和指向队尾的指针Rear初始化为0,循环队列为空的情况只有在Front == Rear下成立,而判断循环队列是否已满需要判断(Rear + 1) % Max_Size == Front,其实循环队列的实现其实就是通过把指针位置对数组大小取模来实现的。在实现循环队列的时候,一般有效的数据个数是Max_Size - 1个,Front所指向的位置存储的数据不作使用,Front + 1所指向的位置存储的是队列首元素,这样可以保证区分队列已满和为空两种情况。   代码如下: CirculaerQueue.h 1 #ifndef _CIRCULARQUEUE_H__ 2 #define _CIRCULARQUEUE_H__ 3 4 typedef struct 5 { 6 int iTime; 10 }ModelData, * pModelData; 11 12 typedef struct 13 { 14 pModelData QueueData; 15 int iFront,iRear; 16 int iMaxNumQueue; 17 }QueueList,

循环队列,顺序表示

こ雲淡風輕ζ 提交于 2020-02-12 15:56:39
#include<iostream.h> #include<stdlib.h> #define OK 1 #define OVERFLOW -2 #define ERROR 0 typedef int Status; typedef int ElemType; #define MAXQSIZE 100 //最大队列长度-1,多留一个元素空间 typedef struct { ElemType *base; //动态分配存储空间 int front; //头指针,若队列不空,指向队列头元素 int rear; //尾指针,若队列不空,指向队列尾元素的下一个位置 }SqQueue; Status InitQueue(SqQueue &Q) { //构造一个空队列Q Q.base=new ElemType[MAXQSIZE]; if(!Q.base) exit(OVERFLOW); //存储分配失效 Q.front=Q.rear=0; return OK; } void CreatQueue(SqQueue &Q,int n) { //插入元素e为Q的新的队尾元素 ElemType e; cout<<"input ElemType e(n)="; for(int i=0;i<n;i++) { cin>>e; Q.base[Q.rear]=e; Q.rear=(Q.rear+1)

循环队列表示与实现

前提是你 提交于 2020-02-12 13:43:36
Code // 循环队列的表示与实现 #include < stdio.h > #include < malloc.h > #include < stdlib.h > #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 #define MAXSIZE 100 struct SqQueue { int * base ; int front; int rear; }; int InitQueue( struct SqQueue * Q) { Q -> base = ( int * )malloc(MAXSIZE * sizeof ( int )); if ( ! Q -> base ) exit(OVERFLOW); Q -> front = Q -> rear = 0 ; return OK; } int SqEmpty( struct SqQueue * Q) { if (Q -> front == Q -> rear) return TRUE; else return FALSE; } int QueueLength( struct SqQueue * Q) { return (Q -> rear - Q -> front) % MAXSIZE; } int EnQueue