enqueue:向队列末端添加一个元素html
dequeue:从队列前端删除一个元素前端
first:考察队列前端的那个元素java
isempty:断定队列是否为空node
size:断定队列中的元素数目git
tostring:返回队列的字符串表示编程
Queue接口api
Queue接口并无实现传统的enqueue,dequeue,和first操做,Queue接口定义了另外两种方法,往队列中添加元素或从队列中删除元素,在异常类处理上,一个提供了布尔返回值,另外一个抛出一个异常。Queue接口定义一个element方法,该方法等价于first、front或peek。该方法检索队列首部的元素,但不删除它。数组
Queue接口提供了两个方法add和offer,add操做能够确保队列含有给定的元素,若是给定的元素没有添加到队列将给出一个异常;offer操做把给定元素插入到队列中,插入成功返回true,不然返回false。架构
凯撒加密法:模块化
是一种简单的消息编码方式:它根据字母表将消息中的每一个字母移动常量的k位。例如,若是k等于3,则在编码后的消息中,每一个字母都会向前移动3位:a会被替换成d,b会被替换成e,c会被替换成f,依此类推。字母表末尾将环绕到字母表开头。因而,w会被替换成z,x会被替换成a,y会被替换成b,z会被替换成c。
解码消息:每一个字母会反方向移动一样的位数。所以,若是k等于3,下面这条已编
码的消息:
vipsolflwb iroorzv frpsohalwb
会被解码成
simplicity follows complexity
重复密钥:
能够将每一个字母移动常数位,而是利用一个密钥值列表,将各个字母移动不一样的位数。若是消息比密钥值列表更长,能够从头再次使用这个密钥列表。例如,假设密钥值为317425,那么第1个字母会移动3位,第2个字母会移动1位,第3个字母会移动7位,等等。将第6个字母移动5位以后,会从头再次使用这个密钥列表。因而第7个字母会移位第8个字母会移动1位,等等。队列的性质使得密钥值能保持正确的次序:不用担忧什么时候抵达密钥末尾,该如何从头开始。
enqueue操做:将新元素放到链表末端。
public void enqueue(T element) { LinearNode<T> node = new LinearNode<T>(element); if (isEmpty()) head = node; else tail.setNext(node); tail = node; count++; }
dequeue操做:首先要确保至少存在一个可返回元素,而且删除队列前端元素。
public T dequeue() throws EmptyCollectionException { if (isEmpty()) throw new EmptyCollectionException("queue"); T result = head.getElement(); head = head.getNext(); count--; if ((isEmpty())) tail = null; return result; }
用线性图来理解就是:
enqueue操做,其中实现了rear在适当的时候绕回到0.
public void enqueue(T element) { if(size() == queue.length) expandCapacity(); queue[rear] = element; rear = (rear+1) % queue.length; count++; }
dequeue操做
public T dequeue() throws EmptyCollectionException { if(isEmpty()) throw new EmptyCollectionException("queue"); T result = queue[front]; queue[rear] = null; front = (front + 1) % queue.length; count--; return result; }
双端队列:是队列的扩展,它容许从队列的两端添加、删除和查看元素。
问题一解决:
(1)在链表末端进行enqueue操做,而在链表前端进行dequeue操做,在进行dequeue操做时,只须要设置一个临时变量指向链表前端的元素,而后把front变量设置为第一个节点的next 指针的值。
(2)在链表的前端进行enqueue操做,末端进行dequeue操做,那么为了从末端出列,必须把一个临时变量设置为指向链表末端的元素,而后把tail指针设置为指向当前末端以前的结点。在单项链表中必须遍历才能找到该结点,这样复杂度为O(n)
(3)相比较来讲,末端入列前端出列更合适。
问题二解决:参考数组实现的 环形队列
每次出队操做,头指针后移,每次入队,尾指针也后移。由于数组是固定长度连续空间,首位指针后移,队尾可插入区域会愈来愈小。固然,能够每次出队,整个队列前移,可是数组移动须要牺牲性能。环形队列能够解决数组移动的缺点,当尾指针超出数组末尾时,尾指针移动数组头部。这就将数组虚拟成了一个环形,只要队列长度没达到最大值,就能够插入,而不用移动数组。
问题一:在作课堂测试时,须要给出size、isEmpty和toString等方法的定义,以完成LinkedStack
问题一解决:开始的toString方法以下
public String toString(){ LinnearNode node = new LinnearNode(); node = top; while (node != null) { System.out.print(node.getElement()+ " "); node = node.getNext(); } return node.getElement().toString();
可是因为在while循环以后,node是不断变化的,最后返回的并非链表内容,修改成以下代码,用字符串形式将链表返回。
LinnearNode<T> node ; String a = ""; node = top; while (node != null) { a += node.getElement().toString()+ " "; node = node.getNext(); } return a;
PP5-1
PP5-2
PP5-7
感受最近学习的这几章内容是一个套路的,因此有点点混乱。在Java上下的功夫有所减小,要及时温习,熟悉课本。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 0/0 | 1/1 | 8/8 |
第二周 | 1163/1163 | 1/2 | 15/23 |
第三周 | 774/1937 | 1/3 | 12/50 |
补充做业:在你一辈子中身体最健康、最旺盛的时候,能在大学学习和研究,是一辈子中少有的机会。请说明一下,你以及具有的专业知识、技能、能力上还差距哪些?请看这个技能调查表,从表中抽取5-7项你认为对你特别重要的技能,记下你目前的水平,和你想在课程结束后达到的水平(必须列出5项)连接
技能 | 课前 | 课后 |
---|---|---|
Programming Overall / 对编程总体的理解 | 3 | 8 |
Programming: Comprehension(程序理解)(如何理解已有的程序,经过阅读,分析,debug) | 4 | 9 |
Personal Software Process (我的软件过程):估计,记录工做量,并逐步提升 | 6 | 9 |
Programming:Implementation(模块实现,逐步细化) | 2 | 9 |
Programming:Design (架构设计,模块化设计,接口设计) | 1 | 8 |