Java數組實現循環隊列的兩種方法

用java實現循環隊列的方法:java

一、添加一個屬性size用來記錄眼下的元素個數。數組

目的是當head=rear的時候。經過size=0仍是size=數組長度。來區分隊列爲空,或者隊列已滿。post

二、數組中僅僅存儲數組大小-1個元素,保證rear轉一圈以後不會和head相等。也就是隊列滿的時候。rear+1=head,中間恰好空一個元素。this

      當rear=head的時候。必定是隊列空了。spa

隊列(Queue)兩端贊成操做的類型不同:
code

可以進行刪除的一端稱爲隊頭,這樣的操做也叫出隊dequeue;
對象

可以進行插入的一端稱爲隊尾,這樣的操做也叫入隊enqueue。隊列


隊列的示意圖
io


實現隊列時,要注意的是假溢出現象。如上圖的最後一幅圖。class


如圖所看到的的假溢出現象


解決的方法:使用鏈式存儲,這顯然可以。在順序存儲時。咱們常見的解決的方法是把它首尾相接,構成循環隊列。這可以充分利用隊列的存儲空間。

循環隊列示意圖:


在上圖中。front指向隊列中第一個元素。rear指向隊列隊尾的下一個位置。

但依舊存在一個問題:當front和rear指向同一個位置時,這表明的是隊空仍是隊滿呢?你們可以想象下這樣的情景。

解決這種問題的常見作法是這種:

使用一標記,用以區分這樣的易混淆的情形。

犧牲一個元素空間。當front和rear相等時,爲空。當rear的下一個位置是front時。爲滿。

例如如下圖:


如下咱們給出循環隊列,並採用另一種方式,即犧牲一個元素空間來區分隊空和隊滿的代碼.

幾個重點:

一、front指向隊頭。rear指向隊尾的下一個位置。

二、隊爲空的推斷:front==rear;隊爲滿的推斷:(rear+1)%MAXSIZE==front。

import java.io.*;
    public class QueueArray {   
    Object[] a; //對象數組,隊列最多存儲a.length-1個對象   
    int front;  //隊首下標   
    int rear;   //隊尾下標   
    public QueueArray(){   
        this(10); //調用其餘構造方法   
    }   
    public QueueArray(int size){   
        a = new Object[size];   
        front = 0;   
        rear =0;   
    }   
    /**  
     * 將一個對象追加到隊列尾部  
     * @param obj 對象  
     * @return 隊列滿時返回false,不然返回true  
     */  
    public boolean enqueue(Object obj){   
        if((rear+1)%a.length==front){   
            return false;   
        }   
        a[rear]=obj;   
        rear = (rear+1)%a.length;   
        return true;   
    }   
    /**  
     * 隊列頭部的第一個對象出隊  
     * @return 出隊的對象,隊列空時返回null  
     */  
    public Object dequeue(){   
        if(rear==front){   
            return null;   
        }   
        Object obj = a[front];   
        front = (front+1)%a.length;   
        return obj;   
    }   
    public static void main(String[] args) {   
        QueueArray q = new QueueArray(4);   
        System.out.println(q.enqueue("張三"));   
        System.out.println(q.enqueue("李斯"));   
        System.out.println(q.enqueue("趙五"));   
        System.out.println(q.enqueue("王一"));//沒法入隊列,隊列滿   
        for(int i=0;i<4;i++){   
            System.out.println(q.dequeue());   
        }   
    }   
} 
相關文章
相關標籤/搜索