3.先入队的先出队,即先进先出(First In First Out),FIFO。 还有一个隐含特性,队列可以自行扩容(缩容),而不需要用户关心,很显然,动态数组已经满足了这个要求。 由此可见,队列的操作并不多,我使用了一个由纯虚函数构成的抽象类作为一个接口来定义这些操作。具体代码如下: template<classT>classQueue{public:virtua...
扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了,队首有位置,应该把元素往前移 主要是上面三个问题,在代码中都有体现,上面的扩容方法借鉴了ArrayList的扩容方法。 package com.helius.structure.queue; import java.util.Arrays; /** * 用数组实现一个队列,即顺序队列 */ public class ArrayQueue { //...
public void add(Object s) { //1.新建一个数组,是原数组长度+1,扩容 Object[] temA=new Object[sa.length+1]; //2.把原数组的,复制到新数组 for(int i=0;i<sa.length;i++){ temA[i]=sa[i]; } //数据结加新数组最后一个位子 temA[temA.length-1]=s; sa=temA; } 删 public Object pop...
publicvoidenqueue(Ee) { // 判断是否需要扩容 ,队尾指针 + 1 和 数组容量取模 if((putIndex+1)%items.length==takeIndex) { resize(2*items.length); } items[putIndex]=e; putIndex++; size++; } @Override publicEdequeue() { if(takeIndex==putIndex) { thrownewRuntimeException("Queue is em...
使用数组实现队列,需要能够实现插入、删除元素,输出当前队列长度,当元素插入大于队列当前设定长度时实现自动扩容(但是小于设定的最大队列长度)等操作. 分析 数组作为连续存储空间,插入元素只需要按顺序插入即可,当删除元素时需要涉及数组元素的移动。为实现以上操作需要定义两个坐标变量,QueueHead指向数组的第一个元素,Queue...
扩容也一样,创建一个数组,把老数组里面的元素挨个复制进去新数组中,这里需要注意的地方是 新数组的第一个位置的元素的值是,老数组的队首元素的值 接着是出队操作dequeue 我们让队首front的元素值为null,让队首的指针向后移动一位,但是这里为了防止越界,我们不能直接fornt++,而是也得取模 ...
7 编写验证程序,首先创建初始大小为32的队列,然后向队列中入列100个数。这样中间应该会调用队列扩容函数。再逐个访问队列数据,打印输出结果,程序运行正确。最后还有队列的释放操作,需要释放队列申请的指针。注意事项 头尾下标相同时,队列为空;尾下标下一个位置为头下标时,队列已满 循环使用数组时,当下标超出数组...
图6:数组扩容 是办法,但是不是最好的办法。因为下标为0和1的空间,无法利用和回收,造成浪费!,不妥!也不可取!有人说无所谓,钱不是问题,金主直接return~ 方案二:移 既然存在空间无法利用,那发现数组空间满了之后,是否可以将元素进行挪动呢?如图: 图7:数组元素移动 ...
扩容和收缩机制 优先队列是用数组实现的四叉小顶堆, 那么就存在数组的扩容和收缩的情况 扩容:最小为4,数组满的时候会扩大为当前容量的2倍。 收缩:数组不会自动收缩,不过可以手动调用 TrimExcess 方法, 当空余的空间大于10% 的时候, 数组的长度会收缩到当前队列元素的数量。