enqueue
与push
、dequeue
与pop
、first
与peek
的操做效果类似。非环形数组实现的元素移位会产生O(n)的复杂度,环形数组能够避免元素移位的须要。html
用于实现数组集合的数据结构与集合自己的匹配是很是重要的。固定数组实现策略对栈是高效的,是由于全部的活动(添加和删除元素)都是在集合的一端进行的,于是也是数组在数组的一端进行的。而对于队列,是在其两端进行操做的,而顺序也就可有可无的了。前端
问题1解决方案:整形变量front(head)和整形变量rear(tail)是从数组两端开始的索引值,当元素出队列,front的值要递减;当元素入队列,rear的值要递增。可是,在数组的最后一个单元时,该元素被删除后front的值从新回到0;填充该元素后rear的值从新回到0。因此,当该队列为空时均为0;该队列全满时均为最大容量。java
- 环形数组与普通数组同样在容量达到最满时须要扩容来添加新的元素
- 一个队列的初始状态,front和rear都指向初始位置(索引为0处)。front永远指向该队列的队头元素,rear则指向该队列最后一个元素的下一位置。
- 当元素入队时在队末进行添加,rear的值逐渐增大,front的值保持不变。
- 当元素出队时在队前进行删除,front的值逐渐增大,rear的值保持不变。
- 判断队满和队空的条件:
(rear + 1) % array.length = front
,咱们就认为队满;front = rear
- rear指向了队尾的后一个位置,也就是新元素将要被插入的位置,若是该位置和front相等了,那么必然说明当前状态已经不能容纳一个元素入队(间接的说明队满)。由于这种状况是和队空的判断条件是同样的,因此咱们选择舍弃一个节点位置,rear指向下一个元素的位置,咱们使用rear + 1判断下一个元素插入以后,是否还能再加入一个元素,若是不能了说明队列满,不能容纳当前元素入队(其实还剩下一个空位置),rear经过取模,回归到初始位置,咱们判断rear + 1是否等于front,若是等于说明队满,不容许入队操做,固然这是牺牲了一个节点位置来实现和判断队空的条件进行区分。
问题1的解决方案:链表实现的队列须要一个头结点,一个尾结点,以及计数的变量。数组实现的队列须要三个整型变量。git
- enqueue:向队列末端添加一个元素
- 数组:先判断环形数组是否已满,未满的状况下能够直接插在下一个可用位置,满的条件下能够进行扩容,在插入可用位置便可。与普通数组不一样的是,在索引值最大时尾部整型变量必须为零。
rear = (rear + 1) % queue.length
经过求余回到0。- 链表:先判断队列是否为空,若是队列为空头结点也要指向添加元素;若是队列不为空,把原链表末尾的结点指向新元素,新元素的位置做为尾结点。
- dequeue:从队列前端删除一个元素
- 数组:判断环形数组是否为空,若是为空则抛出异常;若是不为空则从索引数最小的开始输出。与enqueue方法相似,在索引值最大的被删除后头部整形变量必须为零。
- 链表:判断链表是否为空,若是为空则抛出异常;若是不为空则调出头结点的内容,而后让头结点的下一个做为头结点。
- first:考察队列前端的那个元素
- 数组:直接输出环形数组的头部整形变量索引值的内容。
- 链表:直接输出链表的头结点的内容。
- dequeue与first的区别就是在于队列前端元素的移除和查看。
- isEmpty:断定队列是否为空
- 数组:判断头部整形变量和尾部整形变量是否相等,相等为空。
- 链表:判断链表的元素计数器count变量是否为0,
count = 0
为空。
- toString:
- 数组:从头部整形变量开始输出至尾部整形变量。
- 链表:从链表的头部开始往尾部进行不断输出。
// 判断售票口队伍是否为空 while(!(costomerQueue.isEmpty())){ for(int count = 0; count <= cashiers; count++){ if(!(costomerQueue.isEmpty())){ //队伍不空的话,就取出一位顾客(出队) costomer = costomerQueue.dequeue(); //顾客来的时间和售票口的服务时间相比肯定是否空闲以及服务 if(costomer.getArrivalTime() > cashierTime[count]){ //空闲,能够服务 departs = costomer.getArrivalTime() + PROCESS; }else{ //无空闲,需排队等待 departs = cashierTime[count] + PROCESS; } costomer.setDepartureTime(departs); cashierTime[count] = departs; totalTime += costomer.totalTime(); } } }
本周没有错题......编程
本周结对学习状况
20172314方艺雯
20172323王禹涵数组
结对学习内容:链表和数组实现队列数据结构
第五章的内容相对三四章的知识点要少不少,学起来不是很难。因此,中秋节玩的很开心(ง •̀_•́)ง!!可是老师说的双向链表和把两个链表合在一块儿的的相关代码尚未尝试。算是偷懒了...之后抽时间补上吧!架构
补充做业:在你一辈子中身体最健康、最旺盛的时候,能在大学学习和研究,是一辈子中少有的机会。请说明一下,你以及具有的专业知识、技能、能力上还差距哪些?请看这个技能调查表,从表中抽取5-7项你认为对你特别重要的技能,记下你目前的水平,和你想在课程结束后达到的水平(必须列出5项)。连接模块化
- 1.Programming:Design(架构设计、模块化设计、接口设计) now: 3 ---- expectation: 9
- 2.Programming :Code Review / Code Quality(代码复审、代码规范、代码质量) now: 4 ---- expectation: 9
- 3.Programming :Overall(对编程总体的理解) now:3 ---- expectation:9
- 4.Programming :Test(单元测试、代码覆盖率) now: 4 ---- expectation: 8
- 5.Supporting Knowledge(帮助软件开发工做的其余技能)now:2 ---- expectation:8
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 15/15 | |
第二周 | 703/703 | 1/2 | 20/35 | |
第三周 | 762/1465 | 1/3 | 20/55 |