循环队列

数据结构与算法-循环队列

淺唱寂寞╮ 提交于 2019-12-01 15:57:12
在顺序队列出队列的时候,数组前面会有空余的空间,我们可以将数据往前搬移,提高空余空间的使用,但是效率比较低;我们可以使用循环队列来提高效率。 Head代表队列头,Tail代表队列尾,n代表队列的长度,如果Head与Tail大于等于n的时候就是到了循环点,可以将Head或者Tail余n来代表当前n内的位置。 一开始空余的循环队列,Head和Tail的位置 当有四个元素(a,b,c,d)入队,Head和Tail的位置 当所有元素出队后,Head与Tail是相等的,就是空队列 当满队列,Head和Tail的位置,可以看到Tail的位置是空余的,如果再加入一个元素的话就导致head与tail相等,判断条件是(Tail + 1) % n==Head 代码实现 template<class T> class MyCircularQueue { public: MyCircularQueue(int nQueueSize); ~MyCircularQueue(); bool empty() const; int size() const; void pop(); T front() const; T back() const; bool push(T const&); protected: T* m_pArrayQueue; int m_nQueueSize; int m_nHead; int

【集合】deque循环队列

丶灬走出姿态 提交于 2019-12-01 08:54:39
from collections import deque # 创建长度为3的队列 d = deque([], 3) d.append('1') print(d) d.append('2') print(d) d.append('3') print(d) d.append('4') print(d) 运行结果: deque(['1'], maxlen=3) deque(['1', '2'], maxlen=3) deque(['1', '2', '3'], maxlen=3) deque(['2', '3', '4'], maxlen=3) 来源: https://www.cnblogs.com/biexei/p/11674443.html

c++实现循环队列

筅森魡賤 提交于 2019-11-30 07:57:42
队列(queue)是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出(First In First Out)的线性表,简称FIFO。 允许插入的一端称为队尾,允许删除的一端称为队头。 因为已经限制了插入和删除的位置,所以对于队列,插入和删除时只需要考虑满和空两种状态 顺序队列的操作分别在队头和队尾两端进行。在出队时,队头_front和队尾_rear的值都是只增加(向队列长度_size)靠近;如果仅通过_rear == _size来判断顺序队列是否满队,此时可能存在_rear已经指向_size,同时_front > 0(已有元素出队),顺序队列中实际的元素个数远小于_size而不能做入队操作的情况,导致元素出队后的空闲存储空间永远无法重用,造成假上溢。如下图: 此时再添加元素 _rear 就超出大小 但已经有出队元素 造成前面空间浪费因此让_rear跑的0号位置 实现循环 所以 _front=(_front+1)%_size _rear=(_rear+1)%_szie 实现循环 因此可以看成一个圆环进行存储 通过分析要实现这个循环队列需要成员变量有 int * _pQue; //指向申请的kongjian int _front; // 队头 int _rear; //队尾 int _size //记录空间的大小 封装在类中实现为 1 #include

循环队列

◇◆丶佛笑我妖孽 提交于 2019-11-30 01:37:19
队列是一个有序列表,可以用数组或是链表来实现,遵循先入先出的原则,这是队列的特点。我们要实现的是循环队列。什么是循环队列呢?环形队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间。 举个例子,我们定义一个长度为4的队列,1,2,3,4依次入队,那么现在队列中的情况是[1,2,3,4],如果我们想下一个数5入队,显然是不行的,因为队列满了,我们需要队列中有数字离开,根据先进先出原则,1必须得离开,1离开后的队列为[X,2,3,4],这时候5入队,5是最后一个入队的,但是它的位置却是原来1在的地方,也就[5,2,3,4],存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间也就是这么个意思,不知道大家理解没有?反正我是懂了。。。 队列的属性定义: 1 // 表示队列的长度 2 private int maxQueueSize; 3 // head表示队列的头指向,初始值 = 0 4 private int head; 5 // head表示队列的尾指向,初始值 = 0 6 private int tail; 7 // 该数组用于存放真实的数据 8 private int[] dataArr; 四个属性,都有用,别少了哦。 队列的带参构造方法,用于创建队列,传入的参数为队列长度-1: 1 public CircleQueue(int queueSize) { 2

数据结构--循环队列

穿精又带淫゛_ 提交于 2019-11-29 01:00:26
一.顺序队列的改进 队列元素的出列是在队头,即下标为0的位置,那也就意味着, 队列 中的所有元素都得向前移动,以保证队列的队头(也就是下标为0的位置)不为空,此时的时间复杂度为0(n)。 可有时想想,为什么出队列时一定要全部移动呢,如果不去限制队列的元素必须存储在数组的前n个单元这一条件,出队的性能就会大大增加。也就是说,队头不需要一定在下标为0的位置,比如也可以是a[1]等。 而为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,引入两个指针,front指针指向队头元素,rear指针指向队尾元素的下一个位置,这样当front等于rear时,此队列不是还剩一个元素,而是空队列。 对于队列 最好的方法是使用链表实现 ,因为对于数组来说,队列可能会出现下面这种情况: 假设是长度为5的数组,初始状态,空队列如所示,front与 rear指针均指向下标为0的位置。然后入队a1、a2、a3、a4, front指针依然指向下标为0位置,而rear指针指向下标为4的位置。 出队a1、a2,则front指针指向下标为2的位置,rear不变,如下图所示,再入队a5,此时front指针不变,rear指针移动到数组之外。嗯?数组之外,那将是哪里? 问题还不止于此。假设这个队列的总个数不超过5个,但目前如果接着入队的话,因数组末尾元素已经占用,再向后加,就会产生数组越界的错误,可实际上

【暑假培训】8.22-8.31校训

╄→гoц情女王★ 提交于 2019-11-28 12:10:53
DAY 1 1.1排序算法 1.2排序的应用 1.3复杂度分析 1.1 排序算法 基于比较交换的排序算法 选择排序 思路:不断选择剩下数中最大的数 实现:一个序列,分为已排序区域和未排序区域;每次选择后更新(扩大)已排序区域,直至未排序区域长度为0 代码: 冒泡排序 思路:逐个进行比较交换 很明显效率比较低 插入排序 思路:模拟摸扑克牌的过程?和选择排序的维护序列是差不多的(都是一个序列分为已排序区域和未排序区域)        希尔排序 1.2.排序的应用 -预处理 -多关键字排序 - 离散化 1.3复杂度分析 阶的比较 排序算法复杂度   选择排序   冒泡排序 插入排序 桶排序 归并排序 快速排序 堆排序 复杂度分析技巧 DAY 2 模测 模测 1.归并排序求逆序对 2.电线杆上的小广告 3.逛画展 4.生日礼物 DAY 3 1.1队列 1.2广度优先搜索 1.3循环队列 1.4双向队列 1.5单调栈 1.6单调队列 1.1队列 1.1.1 手写队列 1.1.2 循环队列 只可以存储size-1个元素 通过取模实现 1.2广度优先搜索 1.2.1dfs与bfs dfs:“能达到的都是兄弟” bfs:“能达到的都是我儿子”(雾) 1.2.2为什么我们不能用dp的三种基本方法做dfs / 如何用bfs实现dp的思想 dp与dfs 1.3循环队列 为什么要使用循环队列 实现 1

循环队列的实现

情到浓时终转凉″ 提交于 2019-11-27 19:44:00
class MyCircularQueue: def __init__(self, k: int): """ Initialize your data structure here. Set the size of the queue to be k. """ self.k=k self.front=-1 self.rear=-1 self.queue=[None]*k def enQueue(self, value: int) -> bool: """ Insert an element into the circular queue. Return true if the operation is successful. """ if self.isFull(): return False if self.isEmpty(): self.front = 0 self.rear = (self.rear + 1) % self.k self.queue[self.rear] = value return True def deQueue(self) -> bool: """ Delete an element from the circular queue. Return true if the operation is successful. """ if self

队列:队列在线程池等有限资源池中的应用

三世轮回 提交于 2019-11-27 16:01:34
1.理解队列? 典型队列,先进者先出的结构,是一种操作受限的线性数据结构。 队列类似栈,基本操作也有两个,入列(尾部插入数据)和出列(头部取出数据) 2.实现队列的方式 类似栈,也可以使用数组和链表来实现队列, 顺序队列:使用数组来实现队列 // 用数组实现的队列 public class ArrayQueue { // 数组:items,数组大小:n private String[] items; private int n = 0; // head 表示队头下标,tail 表示队尾下标 private int head = 0; private int tail = 0; // 申请一个大小为 capacity 的数组 public ArrayQueue(int capacity) { items = new String[capacity]; n = capacity; } // 入队 public boolean enqueue(String item) { // 如果 tail == n 表示队列已经满了 if (tail == n) return false; items[tail] = item; ++tail; return true; } // 出队 public String dequeue() { // 如果 head == tail 表示队列为空 if

顺序结构循环队列的基本操作(一)(进队,出队)待优化

心不动则不痛 提交于 2019-11-27 08:48:41
#include<stdio.h> #define ElemType int #include<malloc.h> #define MAXSIZE 10 typedef struct{ ElemType *data; int front,rear; }Queue; typedef struct BitNode{ ElemType data; struct Bitree *Lchild,*Rchild; }BitNode; Queue Init_queue(Queue Q){ Q.data=(ElemType *)malloc(MAXSIZE*sizeof(ElemType)); Q.front=Q.rear=0; return Q; } Queue Enter_queue(Queue Q,ElemType e){ if((Q.rear+1)%MAXSIZE==Q.front){ printf("队满"); }else{ *(Q.data+Q.rear)=e; Q.rear=(Q.rear+1)%MAXSIZE; } return Q; } Queue Leave_queue(Queue Q){ ElemType e; if(Q.rear==Q.front){ printf("队空"); }else{ printf("eo"); e=*(Q.data+Q.front); printf