循环队列

队列和循环队列-php数组

北战南征 提交于 2020-03-25 18:44:39
3 月,跳不动了?>>> //实现基本队列 class Queues { private $head; private $tail; private $cnt; //数组大小 private $array = []; public function __construct($n = 5) { $this->cnt = $n; $this->head = 0; $this->tail = 0; } //数组实现队列 public function basisEnQueue($val) { //队列已满 if ($this->tail == $this->cnt) { return false; } $this->array[$this->tail] = $val; $this->tail++; return true; } //出队列 public function basisDelQueue() { //队列为空 if ($this->head == $this->tail) { return false; } $ret = $this->array[$this->head]; unset($this->array[$this->head]); $this->head++; return $ret; } //队列迁移 使用已删除空间 public function

DS博客作业02--栈和队列

不问归期 提交于 2020-03-22 17:05:30
0.PTA得分截图 1.本周学习总结 1.1 1.1 总结栈和队列内容 栈的 存储结构及操作 : 栈的 存储结构 :和顺序表和链表一样,栈也是用来存储逻辑关系为 一对一 数据的线性存储结构;但不同的是,栈 只在一端 进行插入和删除操作,及所谓的进栈出栈,而且出栈顺序为 先进后出,后进先出 。可以把栈看成一个 羽毛球筒 或 乒乓球筒 ,拿出来的第一个球一定是最后一个放进去的,而对于第一个放进去的球,只有等其他的球都拿出来时才能拿到,这就是先进后出,后进先出。具体示意图如下: 栈的 基本操作 :对于栈的使用,可以直接调用 STL容器 stack ,但使用时必须包含 #include<stack> 头文件。其有以下几个基本操作: empty():测试栈是否为空,如果为空的话返回 true ,否则返回 false 。 size():返回栈中元素个数。 top():返回栈顶元素,即最后push进来的那个元素。 push():压一个值到栈中,即进栈操作。 pop():将栈顶元素弹出,即出栈。 但是这个函数没有返回值!!! 所以如果要获取栈顶元素应该先调用top(),再pop()。 swap():将两个 stack 的内容进行交换,前提是这两个 stack 的 存储的元素类型以及底层采用的基础容器类型都必须相同! 有 两种用法 。例如 x.swap(y) 和 swap(x,y) 都是将x

Java循环队列原理与用法详解

房东的猫 提交于 2020-03-17 16:40:05
某厂面试归来,发现自己落伍了!>>> 在正式进行循环队列学习之前,我们先来看看在顺序队列中删除队首元素出现的问题: (1)设一个容量为capacity=8,size=5(a,b,c,d,e)的数组,左侧为队首、右侧为队尾。 (2)出队一个元素后,需整体往前移动一位 出队: 整体前移一位: 关于该种操作方式我们很容易得出时间复杂度为O(n)。 这时我们就想可不可以在出队元素后,整体元素不往前移,而是在数组中记下队首front是谁,同时队尾tail指向在下一次元素入队时的位置,这样当再有出队时只需要维护一下front的指向即可,而不需移动元素。就这样我们就有了循环队列的情况。 1.循环队列原理 (1)初始,数组整体为空时,队首front、队尾tail指向同一个位置(数组索引为0的地方)也即front==tail 时队列为空 (2)当往数组中添加元素后 (3)出队一个元素,front指向新的位置 (4)入队元素,tail叠加 (5)当tail不能再增加时,数组前面还有空余,此时循环队列就该出场了。 此时数组应该变为这样: 在往数组中添加一个元素: 这样数组就已经满了(tail+1==front 队列满),开始出发扩容操作。capacity中,浪费一个空间。 为了tail能返回到数组的前面位置,将队列满的表达式变为 (tail+1)%c==front这样数组就可以循环移动了。 2

基于动态数组实现的循环队列

大城市里の小女人 提交于 2020-03-17 02:04:35
循环队列的添加和删除操作都是O(1),比普通数组实现的队列要快很多倍。 代码实现 //接口类 public interface Queue < E > { int getSize ( ) ; boolean isEmpty ( ) ; void enqueue ( E e ) ; E dequeue ( ) ; E getFront ( ) ; } / 实现类 public class LoopQueue < E > implements Queue < E > { private E [ ] data ; private int tail , front ; private int size ; public LoopQueue ( int capacity ) { data = ( E [ ] ) new Object [ capacity + 1 ] ; tail = 0 ; front = 0 ; size = 0 ; } public LoopQueue ( ) { this ( 10 ) ; } @Override public int getSize ( ) { return size ; } @Override public boolean isEmpty ( ) { return front == tail ; } @Override public void

读写锁分离的循环队列

空扰寡人 提交于 2020-03-14 05:21:05
在很多需要高性能的场合下,锁的设计一直是一个比较关键的问题。无锁队列、读写锁分离的队列在业界以及学术界都已经有很成熟的研究。在网上也有很多资料, 但其实有很多实现都是错误的 。最近在工作中帮忙追查一个线上问题时,就发现实现一个正确的版本是比较困难的事情。 背景:实现一个循环队列,队列长度已预先分配。支持不同线程的多写多读。 原本的实现是对读和写分别使用了两个不同的锁来提升性能,但是在最早实现的时候 并没有发现到 线程间数据的同步修改会造成小概率读取脏数据 导致线上服务有问题 。 1 size_t Queue::pop(int &value) 2 { 3 AutoLock lock(_poplock); 4 if (!empty()) { 5 value = _queue[_read]; 6 ++ _read; 7 if (_read == _maxsize) { 8 _read = 0; 9 } 10 return 1;11 }12 return 0;13 }14 15 size_t Queue::push(int value)16 {17 AutoLock lock(_pushlock);18 if (!full()) {19 _queue[_write] = value;20 ++ _write;21 if (_write == _maxsize) {22 _write = 0

队列-顺序循环队列

你说的曾经没有我的故事 提交于 2020-03-12 02:34:22
顺序队列(Sequence Queue)用一片连续的存储空间来存储队列中的数据元素. 用一维数组来存放顺序队列中的数据元素。 队头位置设在数组下标为 0 的端,用 front 表示; 队尾位置设在数组的另一端,用 rear 表示。 front 和 rear 随着插入和删除而变化。 当队列为空时, front=rear=0。 因为在出队列(删除元素)的时候,需要花费大量 的时间移动大量元素,速度很慢,所以很少有实际 应用。 循环顺序队列,为了避免大量数据的移动,通常将一维数组的各个元素看成一个收尾相接的封闭的圆环,即第一个元素是最后一个元素的下一个元素,这种形式的顺序队列成为循环顺序队列(Circular sequence Queue)。 C#为我们提供的Queue类就是循环队列。 namespace 队列 { /// <summary> /// 链队列的 节点类 /// </summary> /// <typeparam name="T"></typeparam> class QueueNode<T> { public T data; public QueueNode<T> next; public QueueNode(T _data) { this.data = _data; } public override string ToString() { return data

网络流量控制与管理

这一生的挚爱 提交于 2020-03-03 07:20:23
早期的网络建设中,更多的注意力放在网络的连通性上,只要两点之间能够通过网络连接通讯,就达到目的。并且当时的网络带宽只有10Mbps,甚至还是共享的方式。随着科技技术以及网络应用的发展,越来越多的企业业务依靠于计算机网络,网络就是企业的生命。 网络流量的急剧增加,一方面促进了网络技术的发展,比如从共享10Mbps到交换10Mbps、100Mbps、1000Mbps,甚至10Gbps以太网标准也已经完成。另一方面,网络带宽如何合理、高效、充分的利用也是今天人们谈论得越来越多的话题。 目前,在网络规划中存在3种高效的技术有助于网络流量的管理和控制,它们分别是流控机制、服务质量 (QoS) 和组播技术。但是,拥塞管理和避免机制是最终实现服务质量的手段。 拥塞管理指队列机制。常见的拥塞管理机制包括: 先进先出,优先级队列,循环队列,加权循环队列等等。 先进先出 (FIFO): 实际上无队列或只有一个队列。只有在网络拥塞时缓存数据包,无优先级可言,所有数据包都同等对待。在这种机制下,突发数据包或故障数据包有可能抢占掉所有带宽。建议用于带宽很高,几乎不存在流量拥塞的环境中。 优先级队列 (PQ): 定义优先级队列,并按照优先级的次序处理。只有处理完高优先级队列中的数据包之后,才处理低优先级队列。每转发一个数据包,都要进行一次队列扫描。其结果是: 虽然可以提供优先级服务

尚硅谷Java数据结构学习记录3-循环队列的实现

老子叫甜甜 提交于 2020-03-01 06:08:55
莫得问题 需要注意的地方是循环队列的初始条件和判断队列满的条件 初始条件是front = rear = 0 队列为空的条件 front = rear 队列满的条件 (rear+1)%maxSize = front 空出一个空间 队列中元素的个数 (rear + maxSize - front)% maxSize package datacode; import java.util.Scanner; import datacode.ArrayQueueDemo.ArrayQueue; /* * 用数组模拟循环队列 * 规则如下: * 1.判断循环队列满的条件 预留一个空间 (rear+1)% maxSize == front * 2.判断为空的条件 rear = front */ public class CirleQueueDemo { static class CirleArray{ private int maxSize;//表示数组的最大容量 private int front;//队列头 private int rear;//队列尾 private int[] arr; //front 和 rear的初始值为0 //构造 public CirleArray(int arrMaxSize) { maxSize = arrMaxSize; arr = new int

习题3.12 另类循环队列

*爱你&永不变心* 提交于 2020-02-29 01:42:35
习题3.12 另类循环队列 这个题emmmm,还是有点意思的,我当时错了两次,后面百度加上查《大话数据结构》才发现问题所在。 我们先读一下题,另类循环队列,他是使用了一个循环数组作为了循环队列使用,然后队列的结构体里面含有 储存元素的数组:*Data 队列头指针:Front 队列中所含元素的数量:Count 队列中的最大容量:Maxsize 然后我在总结下循环队列的特点。 首先: 循环队列是一个环,那么就有一个问题出现了,我们咋知道某个元素在队列里是从头指针开始数的第几个??? 那么,循环队列的元素下标就有细微的改变。刚刚开始我便是因为读题不清加上从来没用过循环队列,从而WA了两次。 某个元素的求在队列中的位置的公式: i=Q->Front+Q->Count)%Q->MaxSize 那这题也没啥障碍了。但还有一个要注意的点,就是删除函数,它的返回值是一个ElementType类型,那么我们不能返回bool类型。 AC代码 bool AddQ ( Queue Q , ElementType X ) { if ( Q - > MaxSize == Q - > Count ) { printf ( "Queue Full\n" ) ; return false ; } else { Q - > Count ++ ; Q - > Data [ ( Q - > Front + Q - >

数据结构之顺序队列、链式队列、循环队列-c语言实现

左心房为你撑大大i 提交于 2020-02-27 07:21:27
文章来源: http://blog.seclibs.com/数据结构之顺序队列、链式队列、循环队列-c语言实/ 在上一篇文章里,说了队列的相关内容,其中除了这篇文章说的顺序队列、链式队列和循环队列三个,还提到了阻塞队列和并发队列,这两个因为能力原因,还没能实现,这个坑等以后再来补。 回来说这次实现的三个队列,首先是顺序队列,顺序队列是基于数组来实现的队列,在原数组的实现基础上增加了head和tail两个结构体成员,用来标识队头和队尾。 其他的也没有什么太大的变化了,代码如下 如果需要下载代码的,请移步文末 接下来说链式队列,链式队列的实现与之前的实现都有一点区别,因为链表和队列两个都是需要指针的,所以在这里定义两个结构体的时候需要格外的注意一下,在后面的代码实现中也需要着重理解一下其中的含义。 在定义结构体的时候,我使用了typedef struct和struct两种,可以在代码中去感受一下它们的区别所在。 因为其中有链表的存在,所以在出队的时候需要注意将出队元素的内存空间释放掉,其他的也就没有太多了变化了,代码如下 如果需要下载代码,请移步至文末 最后说循环队列,循环队列实现的难易程度与顺序队列相仿,难点在于当队列放满一次时,如何将变量回到0,从新开始走,这里还是用到前一篇文章中确定队列满时的公式,当head增加到最大时,如何返回0,head=(head+1)%size