隊列 Queue 的循環數組實現


      隊列(queue)是一種基本的線性結構,其特點是先進先出(First In First Out, FIFO)。隊列可以用數組或鏈表實現。當用數組實現時,為了提高空間利用率,數組要“循環使用”。如下圖所示。

      用循環數組的方式實現時,為了方便地判斷隊列是否為空或者滿,可以采用以下方式:

      1) 設隊列最大容量為 max_size,那么要開一個長度為 max_size+1的數組。因為,隊列為0, 1, ..., max_size 個元素共 max_size+1 種狀態。

      2) 如上圖所示, 設 rear 為當前隊列尾部元素在數組中的下標位置,front 為當前隊列頭部元素的邏輯上前一個位置的數組下標,存儲隊列元素的數組下標范圍 0 ~ max_size,則:

          初始時,front = rear = 0。

          當有元素入隊時,先判斷是否滿,不滿則更新尾部位置 rear = (rear + 1) % (max_size + 1),然后將新入隊元素加到數組下標為 rear 處。

          當有元素出隊時,先判斷是否空,不空則更新頭部位置 front = (front + 1) % (max_size + 1),然后該 front 位置元素為出隊元素。

          隊列為滿的條件是:(rear + 1) % (max_size + 1) == front。

          隊列為空的條件是:front == rear。

      隊列循環數組實現(C++)

using namespace std;

const int MAXSIZE = 100000; 

/* 用循環數組實現的隊列 */ 
template <class T> 
class Queue
{
    private:
        int max_size; // 隊列最大容量
        int front;    // 當前隊頭的數組下標 
        int rear;     // 當前隊尾的數組下標 
        T * array;    // 實際存放隊列元素的數組
    
    public:
        Queue()  // 默認構造函數 
        {
            max_size = MAXSIZE;
            front = rear = 0;
            array = new T[max_size+1];
        }
        
        Queue(int _max_size)    // 指定最大隊列容量的構造函數 
        {
            max_size = _max_size < MAXSIZE ? _max_size : MAXSIZE;
            front = rear = 0;
            array = new T[max_size+1];
        }
        
        ~Queue() { delete [] array; }    // 析構函數 
        
        bool full()    // 判斷當前隊列是否滿 
        {
            return (rear + 1) % (max_size + 1) == front;
        }
        
        bool empty()   // 判斷當前隊列是否為空 
        {
            return front == rear;
        }
        
        int push(T & e)    // 將元素e入隊,若成功則返回當前隊尾位置,否則返回-1 
        {
            if ( this->full() )
                return -1;
            rear = (rear + 1) % (max_size + 1);
            array[rear] = e;
            return rear;
        } 
        
        T & query(int pos)  // 返回隊列中位置為pos的元素,pos>=0, pos=0為隊頭。
        {
            pos = (front + pos + 1) % (max_size + 1);
            return array[pos];
        } 
        
        T pop()    // 得到當前隊尾元素,如果隊列為空,則返回的元素無意義 
        {
            if ( this->empty() )
                return array[front]; 
            front = (front + 1) % (max_size + 1);
            return array[front];
        }
}; 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM