1. 程式人生 > >資料結構 - 基於陣列的佇列

資料結構 - 基於陣列的佇列

佇列Queue

  *佇列也是一種線性結構

  *相比於陣列,佇列對應的操作是陣列的子集

  *只能從一端(隊尾)新增元素,從另一端(隊首)取出元素

  *佇列是一種先進先出的資料結構(先到先得 First In First Out)

  

  基於陣列的佇列實現的原始碼如下:

 

package queue;

public interface Queue<E> {
    
    public void enqueue(E e);
    
    public E dequeue();
    
    public E getFront();
    
    public int getSize();
    
    public boolean isEmpty();
}

 

package queue;

import array.Array;

/**
 * 基於陣列實現的佇列
 *
 * @author zhangtianci
 */
public class ArrayQueue<E> implements Queue<E>{

    private Array<E> array;
    
    /**
     * 構造方法
     *
     * @param capacity
     * 佇列的容量
     */
    public ArrayQueue(int capacity){
        array = new Array<>(capacity);
    }
    
    /**
     * 無參構方法,預設容量大小為10
     */
    public ArrayQueue(){
        array = new Array<>();
    }
    
    /**
     * 獲取佇列中元素的個數
     */
    @Override
    public int getSize() {
        return array.getSize();
    }
    
    /**
     * 判斷佇列是否為空,為空則返回true,反之false
     */
    @Override
    public boolean isEmpty() {
        return array.isEmpty();
    }
    
    /**
     * 返回佇列的容量
     * @return
     */
    public int getCapacity(){
        return array.getCapacity();
    }
    
    
    /**
     * 向隊尾新增一個 元素
     */
    @Override
    public void enqueue(E e) {
        array.addLast(e);
    }
    
    /**
     * 移出隊首的元素並返回
     */
    @Override
    public E dequeue() {
        return array.removeFirst();
    }
    
    /**
     * 瞧一眼隊首的元素
     */
    @Override
    public E getFront() {
        return array.getFirst();
    }
    
    @Override
    public String toString(){
        StringBuilder res = new StringBuilder();
        
        res.append(String.format("capacity = %d size = %d\n", getCapacity(),getSize()));
        res.append("Front: ");
        res.append('[');
        for (int i = 0; i < getSize(); i++) {
            res.append(array.get(i));
            if (i != getSize() - 1) {
                res.append(", ");
            }
            
        }
        res.append(']');
        res.append("tail");
        
        return res.toString();
    }
    
    
}

 

  簡單的時間複雜度分析:

  * void enqueue(E e) : O(1) 均攤

  *E dequeue() : O(n)

  *E getFront() : O(1)

  *int getSize() : O(1)

  *boolean isEmpty() : O(1)