JAVAは配列単純シミュレーションキューを使用


前言
シミュレーションは非常に簡単で、その思想を大体体現しているだけだ.ハイエンドの列が実現しても私は逃げません(
キューについて
キューは何ですか?生活の中で簡単な例として、行列ができています.映画の切符を買うと言って、先に行った人は、先に切符を買います.後から来た人は、後ろに並んで待っていました.プログラムの例、迅雷ダウンロード.ダウンロード各種aviの場合,15個以上のタスクがダウンロードされる必要がある場合,5個を同時にダウンロードすると仮定すると,残りの10個はキューで待機し,先にダウンロードした先に完了する.
キューは、このような「先進先出」、「後進後出」のデータ構造です.
アレイシミュレーションキュー
キューの「先進先出」、「後進後出」を考慮すると、キューのヘッダポインタとテールポインタの両方が配列角標として機能する2つの変数が必要です.また、キューが要素を埋めすぎないように、配列に実際に存在する要素の数をリアルタイムで更新する変数も必要です.
実装された解析の一部:
    :
    //     3   
    Object[] queue = new Queue[3];
    //         0,        
    int head = 0;
    int tail = 0;
    int size = 0;

    :   
    //              
    queue[tail] = 1;
    //              
    tail++;
    //        ,        
    size++;

    :   
    //       ,                 
    head++;
    //       ,          
    size--;
/*
          ,     tail  ,     head  。
            ,      ?
   。           。
*/

//            ,         
    tail = 3;
    size =3;
    head = 0;
//        ,         
    tail = 3;
    size = 2;
    head = 1;

//    size  2,        

//  tail   3,                 。

//          

//    head=1,       2

//     0           ,         0             。

//    ,            ,         ,    
    if(size < queue.length) {
        tail = tail % queue.length;
        queue[tail] = 3;
        tail++;
    }

//      ,      。

実装コード
public class GodQueue {

    public static void main(String[] args) {
        GodQueue godQueue = new GodQueue(10);
        //    
        for (int i = 0; i < 10; i++) {
            godQueue.add(i);
        }
        System.out.println("   ,size = " + godQueue.size());
        //  
        System.out.println("-------------------------------");
        while (true) {
            System.out.print(godQueue.remove());
            if (godQueue.size() != 0) {
                System.out.print(" ");
            } else {
                System.out.println();
                break;
            }
        }
        System.out.println("-------------------------------");
        System.out.println("   ,size = " + godQueue.size());
    }


    //         
    private Object[] myQueue;
    //   
    private int queueHead;
    //   
    private int qeueTail;
    //        
    private int queueSize;

    /**
     *     
     * @param maxSize            
     */
    GodQueue(int maxSize) {
        myQueue = new Object[maxSize];
        queueHead = qeueTail = queueSize = 0;
    }


    /**
     *            
     *
     * @return           
     */
    public int size() {
        return queueSize;
    }


    /**
     *         
     *
     * @return         ,     
     */
    public boolean isEmpty() {
        return queueSize == 0 ? true : false;
    }


    /**
     *             
     *
     * @param o          
     * @return           ,     
     */
    public boolean contains(Object o) {
        for (int i = 0; i < size(); i++) {
            if (myQueue[i].equals(o)) {
                return true;
            }
        }
        return false;
    }

    /**
     *            
     *
     * @param o         
     * @return        ,     
     */
    public boolean add(Object o) {
        if (queueSize < myQueue.length) {
            //  :        ,    
            qeueTail = qeueTail % myQueue.length;
            myQueue[qeueTail++] = o;
            //      
            queueSize++;
        } else {
            return false;
        }
        return true;
    }

    /**
     *       
     */
    public void clear() {
        queueHead = queueSize = qeueTail = 0;
    }

    /**
     *             
     *
     * @return         
     */
    public Object remove() {
        if (queueSize > 0) {
            queueSize--;
            queueHead = queueHead % myQueue.length;
            return myQueue[queueHead++];
        }
        return null;
    }

    /**
     *            
     *
     * @return        
     */
    public Object peek() {
        if (queueSize != 0) {
            return myQueue[queueHead];
        }
        return null;
    }

    /**
     *            
     *
     * @param i     
     * @return       i   
     */
    public Object get(int i) {
        i = (queueHead + i) % myQueue.length;
        return myQueue[i];
    }
}

実行結果
   ,size = 10
-------------------------------
0 1 2 3 4 5 6 7 8 9
-------------------------------
   ,size = 0

END