1. 程式人生 > 實用技巧 >2012_線性表之佇列

2012_線性表之佇列

2.4 佇列

佇列是一種基於先進先出的資料結構, 是一種只能在一端進行插入, 在另一端進行刪除的特殊線性表, 它按照先進先出的原則儲存資料, 先進入的資料, 在讀取資料時先被讀出來.

2.4.1 API設計

類名 Queue
構造器 Queue()
成員方法 1. public boolean isEmpty()
2. public int size()
3. pubic T dequequ() 拿出一個元素
4. public void enqueue()插入元素
成員變數 1. private Node head();
2. private int N;
3. private Node last;
成員內部類 private class Node

2.4.2 實現

package b_linear.d_queue;

import java.util.Iterator;

/**
 * 佇列
 */
public class Queue<T> implements Iterable<T>{
    private Node head;
    private Node last;
    private int N;


    private class Node {
        public T item;
        public Node next;

        public Node(T item, Node next) {
            this.item = item;
            this.next = next;
        }
    }

    public Queue() {
        this.head = new Node(null, null);
        this.last = null;
        this.N = 0;
    }

    public boolean isEmpty() {
        return N == 0;
    }

    public int size() {
        return N;
    }

    //新增元素
    public void equeue(T t) {
        //當前尾結點為null
        if(last == null) {
            last = new Node(t, null);
            head.next = last;
        }else{
            //當前尾結點不為null
            Node oldLast = last;
            last = new Node(t, null);
            oldLast.next = last;
        }
        //元素個數+1;
        N++;


    }

    //拿出元素
    public T dequeue() {
        if(isEmpty()) {
            return null;
        }
        Node oldFist = head.next;
        head.next = oldFist.next;
        N--;

        //出佇列是在刪除元素, 如果佇列中元素刪除完了, 重置last=null;
        if(isEmpty()) {
            last = null;
        }
        return oldFist.item;
    }

    @Override
    public Iterator<T> iterator() {
        return new QIterator();
    }
    private class QIterator implements Iterator {
        private Node n;
        public QIterator() {
            this.n = head;
        }
        @Override
        public boolean hasNext() {
            return n.next != null;
        }

        @Override
        public Object next() {
            n = n.next;
            return n.item;
        }
    }

}

2.4.3 測試

package b_linear.d_queue;

/**
 * 佇列測試
 */
public class QueueTest {
    public static void main(String[] args) {
        //建立佇列
        Queue<String> queue = new Queue<>();

        //新增元素
        queue.equeue("a");
        queue.equeue("b");
        queue.equeue("c");
        queue.equeue("d");
        for (String s : queue) {
            System.out.println(s);
        }
        System.out.println("-----------");
        //拿出元素
        String result = queue.dequeue();
        System.out.println("出佇列:" + result);
        System.out.println("剩餘元素: " + queue.size());

    }
}

測試結果

a
b
c
d
-----------
出佇列:a
剩餘元素: 3