首页天道酬勤单循环赛和双循环赛公式,全民农场广东人聊天吹牛必备

单循环赛和双循环赛公式,全民农场广东人聊天吹牛必备

张世龙 05-06 11:57 112次浏览

循环队列循环队列的概念循环队列实际上还是一个队列,从外部调用的接口和实际功能来看,它与普通队列完全不同。 之所以将其称为循环队列而不是队列,是因为实现的基础逻辑与一般队列不同。 一般队列的基础采用双向链表,循环队列的基础采用索引持续循环的数组。

要创建循环队列操作图标循环队列,必须首先创建数组。

E elements=(E[] )新对象[8]; //其中e统称为队列中放入11、22、33、44个要素,其存储结构如图所示。

现在,如果将元素55排队,它将紧跟在末尾元素之后排队。

如果退出队列,会有点复杂。 清空队列的第一个元素,并将front的方向向后移动。

据此三次出队,进入66、77、88队,结果如下图所示。

如果希望在数组没有更大的索引位置时继续入队到99,请使用索引循环。 也就是说,将其放置在左侧空出的数组空间中。 此时,如果入队的元素从0开始,即前端从0开始,则入队的元素必须位于索引为4的size位置。 因为已经有4个要素,所以分别被配置在0、1、2、3的位置。 在这种情况下,由于前端偏移,入队元素的放置位置也必须偏移。 也就是说,size front=8。 另一方面,8明显超过了可以使用数组的索引。 此时,以8对数组大小为模具,在左侧放置空的数组空间(循环)。

重新入队100、101和102 :

队列已满。 如果要继续入队,则需要进行扩展。 创建新的大数组,从0开始迁移数组,并修改原始数组引用对象以指向新数组。

私密性voidensurecapacity (int new size ) { int old capacity=elements.length; //如果容量可以承受,则不扩展新大小=old容量(if )返回; //否则,1.5新大小=old容量(old容量1 ); E[] newElements=(E[] ) new Object[newSize]; //数据迁移for(intI=0; isize; I ) new elements [ I ]=elements [索引(I ); 元素=新元素; 前端=0; //将指针归零system.out.println(oldcapacity )扩展到) newSize; }/***简化建模的索引映射* @ paramindex * @ return */private intindex (intindex )//避免(低效)索引=front; 返回索引--(index=elements.length? elements.length:0; }此时扩展的结果如下。

然后加入队伍:

以上是循环队列的操作步骤。

具体为publicclasscirclequeuee { private int front; //头节点专用大小; 私有e [ ]元素; //默认队列大小privatestaticfinalintdefault _ capacity=10; publiccirclequeue((this ) ) default_capacity; }publiccirclequeue(intcapacity ) capacity=capacity default _ capacity? capacity:DEFAULT_CAPACITY; 元素=(e [ ] ) new Object[capacity]; } /** *获取队列大小* @ return */public intsize ({ returnsize; } /** *判断数组是否为空* @return */public boolean isEmpty () { return size==0; } /** *队列* /公共语音清除() /清除所有引用并等待jvm进行垃圾回收的for(intI=0; isize; I )元素[索引(I ) ]=null; size=0; //恢复指针front=0; } /** *入队*///00123公共语音关闭(e element ) (ensurecapacity ) size1); elements [索引(size ) ]=element; //入队到末尾

size++; } private void ensureCapacity(int newSize){ int oldCapacity=elements.length; //如果容量可以承受 if(newSize<=oldCapacity)return; //否则扩容1.5 newSize=oldCapacity+(oldCapacity>>1); E[] newElements= (E[]) new Object[newSize]; //数据迁移 for(int i=0;i<size;i++) newElements[i]=elements[index(i)]; elements=newElements; front=0;//指针归零 System.out.println(oldCapacity+"扩容为"+newSize); } /** * 简化取模的索引映射 * @param index * @return */ private int index(int index){ //避免取模运算(效率低下) index+=front; return index-(index>=elements.length?elements.length:0); } /** * 出队 * @return */ public E poll(){ E frontElement=elements[front]; elements[front]=null; front=index(1);//更新指针到下一个元素 size--; return frontElement; } /** * 获取队头元素 * @return */ public E peek(){ return elements[front]; } @Override public String toString() { return "CircleQueue{" + "front=" + front + ", size=" + size + ", elements=" + Arrays.toString(elements) + '}'; }} 循环双端队列 循环双端队列概念

循环双端队列其实就是一个双端队列,即可以在队头和队尾都进行入队或者出队操作的队列。它与循环队列相比,也只是增加了在队尾进行出队操作的接口offerRear和在队头进行入队操作的pollFront,其次由于在队头入队需要获取到原始索引为-1的映射索引(即头节点之前的节点,头节点原始索引为0),还需要对提供索引映射的index(int index)方法进行修改。

具体实现 public class CircleDeque<E> { private int front;//指向头节点 private int size; private E[] elements; //默认队列大小 private static final int DEFAULT_CAPACITY=10; public CircleDeque(){ this(DEFAULT_CAPACITY); } public CircleDeque(int capacity){ capacity=capacity>DEFAULT_CAPACITY?capacity:DEFAULT_CAPACITY; elements= (E[]) new Object[capacity]; } /** * 获取队列大小 * @return */ public int size(){ return size; } /** * 判断数组是否为空 * @return */ public boolean isEmpty(){ return size==0; } /** * 清空队列 */ public void clear(){ //清空所有引用,等待jvm进行垃圾回收 for(int i=0;i<size;i++) elements[index(i)]=null; size=0; //还原指针 front=0; } /** * 从队尾入队 */ // 0 0 1 2 3 public void offerRear(E element){ ensureCapacity(size+1); elements[index(size)]=element;//末尾入队 size++; } /** * 从队头入队 */ public void offerFront(E element){ ensureCapacity(size+1); int newFront=size==0?0:index(-1);//若放放入的是第一个元素,直接放在0处 elements[front=newFront]=element;//队头入队并跟新front size++; } private void ensureCapacity(int newSize){ int oldCapacity=elements.length; //如果容量可以承受 if(newSize<=oldCapacity)return; //否则扩容1.5 newSize=oldCapacity+(oldCapacity>>1); E[] newElements= (E[]) new Object[newSize]; //数据迁移 for(int i=0;i<size;i++) newElements[i]=elements[index(i)]; elements=newElements; front=0;//指针归零 System.out.println(oldCapacity+"扩容为"+newSize); } /** * 简化取模的索引映射 * @param index * @return */ private int index(int index){ //防止index为-1 //避免取模操作 index+=front; if(index<0) return index+elements.length; return index-(index>=elements.length?elements.length:0); } /** * 从队头出队 * @return */ public E pollFront(){ E frontElement=elements[front]; elements[front]=null; front=index(1);//更新指针到下一个元素 size--; return frontElement; } /** * 从队尾出队 * @return */ public E pollRear(){ int rear=index(size-1); E frontElement=elements[rear]; elements[rear]=null;//尾部出队 size--; return frontElement; } /** * 获取队头元素 * @return */ public E peekFront(){ return elements[front]; } /** * 获取队尾元素 * @return */ public E peekRear(){ return elements[index(size-1)]; } @Override public String toString() { return "CircleDeque{" + "front=" + front + ", size=" + size + ", elements=" + Arrays.toString(elements) + '}'; }}
循环队列原理图,简要叙述循环队列的数据结构