队列是一种线性结构,队列元素按照FIFO方式处理。html
队列和栈十分类似,因此只须要学习好前面两个章节就能够有效地理解“队列”的基本概念了。node
其方法的功能上能够大概地一一对应起来
push-->enqueue
pop-->dequeue
peek-->firstgit
因此在最后经过链表、数组来实现队列的问题和实现栈也很是相似,实现起来很是轻松。数组
值得注意的是实现队列时,要注意两端(front, rear)而非一端(栈中的peek),因此利用固定数组来实现队列的效率不高,而动态的链表会好得多,为了有效利用数组的空闲空间,书上采用了环形数组的方式。网络
环形数组的大体概念和原理,能够借助以前介绍过的循环链表进行理解。从概念上来讲,若是数组的最后一个索引后面跟的是第一个索引,那么该数组就可用做环形数组。数据结构
当front和rear指向同一个位置时,这表明的是队空仍是队满呢?
(图)学习
为区分两种状况,能够空出一个元素空间,当rear的下一个位置是front时为满,当rear和front位置重合时为空。
(图)ui
何以达到循环的目的呢(最后一个索引后面跟着第一个索引)?能够参照书中的例子:设计
public void enqueue(T element) { if (size() == queue.length) expandCapacity(); queue[rear] = element; rear = (rear+1) % queue.length; count++; } private void expandCapacity() { T[] larger = (T[]) (new Object[queue.length *2]); for (int scan = 0; scan < count; scan++) { larger[scan] = queue[front]; front = (front + 1) % queue.length; } front = 0; rear = count; queue = larger; }
这两个方法就很好的解释了环形的实现——经过更新front
和rear
的值。3d
public void chadui(T element) { LinearNode<T> node = new LinearNode<>(element); if (isEmpty()) head = node; else { head.setPrevious(node); head = head.getPrevious(); } count++; }
(图)
排在后面的人都跑了,看来是队伍断了
public void chadui(T element) { LinearNode<T> node = new LinearNode<>(element); if (isEmpty()) head = node; else { node.setNext(head); head.setPrevious(node); head = head.getPrevious(); } count++; }
(图)
加上node.setNext(head);
连接起来,队伍重连起来。
(statistics.sh脚本的运行结果截图)
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 6/6 | |
第二周 | 771/771 | 1/2 | 16/22 | |
第三周 | 562/1233 | 1/3 | 15/37 |
唐才铭19:对书中的知识点总结到位,网络文章截图多了一点;
王文彬29:对书上的内容记述详细,有独特看法,也在书本的基础上提出了新问题;引用材料有点长,但本身理解了吧。