隊列(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]; } };
