學號 2018-2019-20172309 《程序設計與數據結構(下)》第三周學習總結
阿新 • • 發佈:2018-09-27
num 退出 單向 隊列 就是 5.1 選擇 ati imp
教材學習內容總結
教材學習內容總結
5.1 隊列概述
- 隊列的元素是按照FIFO方式處理的:第一個進入的元素,也就是第一個退出的元素。
- 隊列的處理方式與棧相反,棧的處理方式是LIFO。
- 隊列中的方法有enqueue,dequeue,first等同於棧中的push,pop,peek
5.2 java API中的隊列
- java集合API提供了java.util.Stack類,他實現了棧集合。但他並沒有提供隊列類,而是提供了一個Queue接口。
- java.util.Stack類提供了push,pop和peek等操作,queue接口提供了兩個方法add和offer。
- queue中的方法:
5.3 使用隊列:代碼秘鑰和售票口模擬。
- 隊列是一種可儲存重復編碼秘鑰的遍歷集合。
- 通常用表示排隊的隊列來實現模擬。
5.4 隊列ADT
- 就像棧一樣,我們也定義一個泛型QueueADT接口,表示隊列的操作,把操作的一般目標與各種實現方式分開。
5.5 實現隊列
5.5.1 用鏈表實現對列
- 兩個分別指向鏈表首元素、鏈表末元素的引用方便隊列的鏈表實現。
- 對於單向鏈表,可選擇從末端入列,從前段出列。雙向鏈表可以解決需要遍歷鏈表的問題,因此在雙向鏈表實現中,無所謂從哪端入列和出列。
- 代碼:
public class CircularArrayQueue<T> implements QueueADT<T> { private final static int DEFAULT_CAPACITY = 100; private int front, rear, count; private T[] queue; /** * Creates an empty queue using the specified capacity. * @param initialCapacity the initial size of the circular array queue */ public CircularArrayQueue (int initialCapacity) { front = rear = count = 0; queue = (T[]) (new Object[initialCapacity]); } /** * Creates an empty queue using the default capacity. */ public CircularArrayQueue() { this(DEFAULT_CAPACITY); } /** * Adds the specified element to the rear of this queue, expanding * the capacity of the queue array if necessary. * @param element the element to add to the rear of the queue */ public void enqueue(T element) { if (size() == queue.length) expandCapacity(); queue[rear] = element; rear = (rear+1) % queue.length; count++; } /** * Creates a new array to store the contents of this queue with * twice the capacity of the old one. */ 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; } /** * Removes the element at the front of this queue and returns a * reference to it. * @return the element removed from the front of the queue * @throws EmptyCollectionException if the queue is empty */ public T dequeue() throws EmptyCollectionException { if (isEmpty()) throw new EmptyCollectionException("queue"); T result = queue[front]; queue[front] = null; front = (front+1) % queue.length; count--; return result; } /** * Returns a reference to the element at the front of this queue. * The element is not removed from the queue. * @return the first element in the queue * @throws EmptyCollectionException if the queue is empty */ public T first() throws EmptyCollectionException { if (isEmpty()){ throw new EmptyCollectionException("queue"); } else return queue[front]; // To be completed as a Programming Project } /** * Returns true if this queue is empty and false otherwise. * @return true if this queue is empty */ public boolean isEmpty() { return count==0; // To be completed as a Programming Project } /** * Returns the number of elements currently in this queue. * @return the size of the queue */ public int size() { return count; // To be completed as a Programming Project } /** * Returns a string representation of this queue. * @return the string representation of the queue */ public String toString() { String result = ""; int a =front; for (int i = 0 ;i< count;i++){ result += queue[a]+" "; a++; } return result; // To be completed as a Programming Project } }
5.5.2 用數組實現隊列
- 代碼:
public class LinkedQueue<T> implements QueueADT<T> { private int count; private LinearNode<T> head, tail; /** * Creates an empty queue. */ public LinkedQueue() { count = 0; head = tail = null; } /** * Adds the specified element to the tail of this queue. * @param element the element to be added to the tail of the queue */ public void enqueue(T element) { LinearNode<T> node = new LinearNode<T>(element); if (isEmpty()) head = node; else tail.setNext(node); tail = node; count++; } /** * Removes the element at the head of this queue and returns a * reference to it. * @return the element at the head of this queue * @throws EmptyCollectionException if the queue is empty */ 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; } /** * Returns a reference to the element at the head of this queue. * The element is not removed from the queue. * @return a reference to the first element in this queue * @throws EmptyCollectionException if the queue is empty */ public T first() throws EmptyCollectionException { if (isEmpty()){ throw new EmptyCollectionException("queue"); } else return head.getElement() ; // To be completed as a Programming Project } /** * Returns true if this queue is empty and false otherwise. * @return true if this queue is empty */ public boolean isEmpty() { return count == 0; // To be completed as a Programming Project } /** * Returns the number of elements currently in this queue. * @return the number of elements in the queue */ public int size() { return count; // To be completed as a Programming Project } /** * Returns a string representation of this queue. * @return the string representation of the queue */ public String toString() { String result = "" ; while(head!=null){ result+=head.getElement()+" "; head = head.getNext(); } return result; // To be completed as a Programming Project } }
學號 2018-2019-20172309 《程序設計與數據結構(下)》第三周學習總結