循环队列

数据结构与算法--栈、队列(队列)

馋奶兔 提交于 2019-12-20 00:21:39
Hello,everybody.我们又见面了。今天我们来学习一下队列这个数据结构,let’s Go,开始我们的征程吧。 首先,举两个生活中的常见例子。相信大家,在用电脑工作娱乐时,都会碰到这样的现象。当我们点击程序或进行其他操作时,电脑处于死机状态。正当我们准备Reset时,它突然像打了鸡血似的,突然把刚才我们的操作,按顺序执行了一遍。之所以会出现这个现象,是因为操作系统的多个程序,需要通过一个管道输出,而按先后顺序排队造成的。 还有有个例子,在我们打客服热线时,有时会出现等待的现象。当其他客户挂断电话,客服人员才会接通我们的电话。因为客服人员相对于客户而言,总是不够的,当客户量大于客服人员时,就会造成排队等待的想象。 操作系统、客服系统,都是应用了一种数据结构才实现了这种先进先出的排队功能,这个数据结构就是队列。 队列(Queue): 是只允许在一端进行插入操作,在另一端进行删除操作的线性表。 队列也是一种特殊的线性表,是一种先进先出的线性表。允许插入的一端称为表尾,允许删除的一端称为表头。 上图,很形象的表示了队列的结构。排在前面的先出,排在后面的后出。换句话,先进的先出,后进额后出。我们在队尾插入数据,队头删除数据。 队列的抽象数据类型: 同样是线性表,队列也有类似线性表的操作,不同的是,插入操作只能在队尾,删除操作只能在队头。 上图是队列的抽象数据类型。 顺序存储的队列:

数据结构与算法(六)循环队列——顺序存储结构

孤者浪人 提交于 2019-12-18 01:28:39
循环队列 先不急着给循环队列的定义,先看队列循环存储结构的弊端。 队列顺序存储结构的弊端 队列的顺序存储结构本身是由ArrayList实现的,在数据元素入队的时候,相当于在ArrayList表尾添加元素,在数据元素出队的时候,相当于在ArrayList表头删除元素。很明显,入队的时间复杂度O(1),出队的时间复杂度O(n),线性表增删数据元素时间复杂符都是O(n),但是这个是按平均算的。队列的出队时间复杂度O(n),可不是按平均算的,因为每次出队都是O(n)。 有弊端,就可以换其他思路进行优化 优化一 :为了避免当只有一个元素时,队头队尾重合处理变得麻烦,所有引入两个指针,front指向队头元素,rear指向队尾元,让队头指针和队尾指针随着元素的变化而移动。这样我们入队和出队操作都是O(1)。 问题 :rear指针到了表尾就不能后移了,而且出队front一直后移,前面的空间就浪费了。 优化二 :当队头或队尾指针到达尾部时,如需后移可重新指向表头,就相当于是把线性表首尾相连,变成一个环,指针从尾到头有一个周期性,也就是数线性表长度,指针+1对线性表长度取余就可以完成指针从头到尾的跳跃,这样就解决了空间浪费的问题。 问题 :但是又有新的问题,我们判断队列满和队列空的条件都是(rear+1)%n==front,这里n是线性表的长度,这就没法做正确的判断了。 优化三

队列,循环队列,乒乓队列区别

柔情痞子 提交于 2019-12-15 19:49:37
很久以前就想说一说这哥仨的区别了,可是奈何懒癌间歇性发作,对这个task是视而不见,汗颜。。好了,废话不说了,进入正题。 首先,先看最基础的队列: 队列嘛,内部使用数组实现的话,无非是从头部读取,在尾部插入 但是有一个缺点,就是队列经过若干次的读取后,前面明明还有空间,却不能再使用了 解决这个问题的直观办法就像这样 就是每删除一个头,后面的所有元素往前移动一位。现实生活中的确是这样,前面的人走了,后面的人顶上去。 但是,这个方法是有问题的,这种方法带来了复制元素的开销,当队列很大时,将会带来严重的性能问题。 因此,为了解决这个问题,循环队列(也叫循环缓冲区)应运而生。其特点是,使用读指针和写指针来完成队列头和队列尾部的判断 这样就没有了复制元素带来的开销了,本质上还是对一个队列的读写过程的优化和改进。 那么乒乓缓冲区又是什么鬼呢,它对应的是个什么场景呢? 我们思考这样一件事,串口的数据通过DMA搬到一个buffer里面,然后在搬运的过程没有结束的时候,一般不能操作这个buffer,只有等搬运完毕 等到DMA中断才可以进行操作。但是,这段时间CPU相当于就被浪费掉了,啥事也没干。这显然是算力的浪费(这里指的是单任务环境下),而且,CPU开始处理后, 那下一帧数据又来了咋办呢,毕竟我们又不能预料什么时候会发生串口中断,那上一帧数据岂不是被破坏了吗?这个时候有人可能说了

顺序队列 循环队列 链式队列 C语言实现

梦想与她 提交于 2019-12-11 08:06:53
顺序队列 循环队列 链式队列 C语言实现 1.顺序队列 Queue.h # pragma once # include <stdio.h> # include <stdlib.h> # define true 1 # define false 0 # define MAX 5 typedef int bool ; typedef int ElemType ; typedef struct { ElemType data [ MAX ] ; int front , rear ; } Queue ; //初始化队列 void InitQueue ( Queue * Q ) ; //判断队列是否为空 bool Empty ( Queue Q ) ; //判断队列是否为满 bool Full ( Queue Q ) ; //入队 bool EnQueue ( Queue * Q , ElemType e ) ; //出队 bool DeQueue ( Queue * Q , ElemType * e ) ; //读队头元素 bool GetHead ( Queue Q , ElemType * e ) ; Queue.c # include "Queue.h" //初始化队列 /* 注意队列的front==rear时表示队列为空,rear表示指向下一个即将入队的位置

数据结构学习(循环队列)

回眸只為那壹抹淺笑 提交于 2019-12-10 22:16:29
1. 尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定 2. 这个在做判断队列满的时候需要注意 (rear + 1) % maxSize == front [满] rear == front [空] package cn.imut; //循环队列 import java.util.Scanner; public class CircleArrayQueueDemo { public static void main(String[] args) { System.out.println("测试数组模拟循环队列的案例"); //创建一个队列 CircleArray circlequeue = new CircleArray(4); //这里设置4,其队列的有效数据最大是3 var key = ' '; //接收用户输入 Scanner sc = new Scanner(System.in); boolean loop = true; //输出一个菜单 while(loop){ System.out.println("s(show): 显示队列"); System.out.println("e(exit): 退出程序"); System.out.println("a(add): 添加数据到队列"); System.out.println("g(get): 从队列取出数据

数据结构之循环队列

醉酒当歌 提交于 2019-12-10 00:55:41
引言 本文中对队列进行了基本介绍,通过对队列的基本原理进行一些说明,加之代码实现,以此记录。 队列的基本介绍 队列在存储结构上是一种线性结构,具有以下两个特点: 1,具备先进先出(FIFO,first int first out)原则 2,操作队列中的元素,只能在队首和队尾两端操作,入队:队尾添加,出队:队首删除 进队操作演示: 图1-1 入队之前队列中的元素:5 3 8 将7 4 6依次从队尾入队之后 队列中元素:5 3 8 7 4 6 出队操作演示: 图1-2 我们在前面将7 4 6入队之后,队列现在的情况为: 5 3 8 7 4 6 出队时,操作队首元素,将队首元素”删除" 出队后,队列情况为: 3 8 7 4 6 通过以上可以发现队列的特性,即先进先出原则,入队操作是将元素添加至队尾,进行”排队”,出队时,是将队首元素”删除”,由于队列的插入和删除操作分别在队尾和队首进行,每个元素必然按照进入的次序离队,也就是说先进队的元素必定先离队,所以队列也成为 先进先出表。 队列结构与日常生活中排队等候服务的模型是一致的,最早进入队列的人,最早得到服务并从队首离开,最后到来的人只能排在队列的最后,最后得到服务并最后离开。本文中采用数组实现顺序队列和循环队列(逻辑上的循环,原理后文会给出),因为顺序队列比较简单,下面直接给出代码实现: 1 import java.lang

leetcode622. 设计循环队列

佐手、 提交于 2019-12-04 23:57:02
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实现应该支持如下操作: MyCircularQueue(k): 构造器,设置队列长度为 k 。 Front: 从队首获取元素。如果队列为空,返回 -1 。 Rear: 获取队尾元素。如果队列为空,返回 -1 。 enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。 deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。 isEmpty(): 检查循环队列是否为空。 isFull(): 检查循环队列是否已满 一)循环队列 设计一个循环对列,重点在于在各项操作中维持数据不变式,即维持对象属性之间的正确关系。 (1)构造函数中定义四个属性: self._len:队列长度 self._elems:用于记录循环队列元素的列表 self._head:队列中第一个元素的下标 self._num:队列中的元素个数 (2)进队列 在队列尾部加入元素,并是self._num加1,以维持对象属性之间的正确关系。

数据结构――队列(循环队列)的基本操作(实现链队列逐一取出c语言代码)

匿名 (未验证) 提交于 2019-12-03 00:37:01
队列 队列是一种重要的线性结构,与栈相同也需要顺序表或者链表作为基础。队列是先进先出(first in first out)FIFO的线性表。 所有数据从队列的一端进入,从另一端离开。 队列中允许插入数据一端称队尾(rear),允许数据离开的一端称队头(front) 既可以是顺序表也可以是链表 创建一个空队列 入队列操作 出队列操作 实例分析 /******************************************** *实现一个链队列,任意输入一串字符,以@为结束标志 *将队列中的元素逐一取出,打印在屏幕上 ********************************************/ #include<bits/stdc++.h> /********************************************* *定义一个完整的队列。QNode表示队列中每个元素都是QNode *链队列:包含数据域data和指针域next *QueuePtr为指向QNode元素的指针类型 等价于*QNode *再定义一个LinkQueue类型 front指向队头 rear指向队尾 **********************************************/ typedef struct QNode{ char data; struct

rear和length表示的循环队列

匿名 (未验证) 提交于 2019-12-03 00:34:01
描述 假设将循环队列定义为:以与变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。试给出此循环队列的队满条件,并写出相应的入队列和出队列的算法(在出队列的算法中要返回队头元素)。 输入 先输入一个不大于100的正整数n(输入数据个数)和m(循环队列数组的大小),再输入n个整数,其中输入0表示出队。 输出 要求用循环队列实现,队满时如有入队则输出"No"并丢掉此元素,出队时输出这个元素。注意:这种表示方法队列中可以存储m个元素! 输入样例 输出样例 2 No 6 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> typedef struct node{ int *data; int length; int rear; int front; }Queue,*PQueue; PQueue Create() { Queue *q; q = (Queue *)malloc(sizeof(Queue)); q->rear = q->front = -1; q->length = 0; return q; } void push(Queue *s,int x,int n) { if(s->length == n) { printf("No\n"); return;

循环队列队满和队空判定

匿名 (未验证) 提交于 2019-12-03 00:30:01
现有一循环队列,其队头指针为front,队尾指针为rear;循环队列长度为N。其队内有效长度为?(假设队头不存放数据) 答案:(rear-front+N)%N 队满条件为:(rear+1)%QueueSize==front 队空条件为:front==rear 队列长度为:(rear-front++QueueSize)%QueueSize 队满条件为:size==QueueSize 队空条件为:size==0 tag表示0的情况下,若因删除导致front==rear,则队空; tag等于1的情况,若因插入导致front==rear则队满 循环队列的存储空间为Q(1:50),初始状态为front=rear=50。 经过一系列正常的入队与退队操作后,front=rear=25。此后又插入一个元素,则循环队列中的元素个数为多少? 答案:1,或50且产生上溢错误 循环队列的存储空间为Q(1:40),初始状态为front=rear=40。 经过一系列正常的入队与退队操作后,front=rear=15,此后又退出一个元素,则循环队列中的元素个数为多少? 答案:39,或0且产生下溢错误 设循环队列的存储空间为Q(1:35),初始状态为front=rear=35。现经过一系列入队与退队运算后,front=15,rear=15,则循环队列中的元素个数为多少? 答案:0或35 循环队列的存储空间为Q(1