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 |