queue 隊列容器
queue 隊列也是一個線性存儲表,與后進先出的堆棧不同,元素數據的插入在表的一端進行,在另一端刪除,從而構成了一個先進先出(First In First Out) 表。插入一端稱為隊尾,刪除一端稱為隊首。
由於C++ STL 的隊列泛化,默認使用雙端隊列 deque 來實現,因此,queue 也可看成一個容器的適配器,將 deque 容器轉換為 queue 容器。當然,也可以利用其它合適的序列容器作為底層實現 queue 容器。
queue隊列容器的C++標准頭文件為 queue ,需要用宏語句 "#include <queue>" 包含進來才可應用 queue 容器進行開發。
創建 queue 對象
使用 queue 隊列之前,要先利用構造函數創建一個隊列對象,才可進行元素的入隊、出對、取隊首和隊尾等操作。
1. queue()
默認的構造函數,創建一個空的 queue 對象。例如,下面一行代碼使用默認的雙端隊列為底層容器創建了一個空的 queue 隊列對象 q ,數據元素為 int 類型。
queue<int> q;
2. queue(const queue&)
復制構造函數,用一個 queue 對象創建新的 queue 對象。例如,下面一行代碼利用 queue 對象 q1 ,創建一個以雙向鏈表為底層容器的 queue 對象 q2.
// queue<int, list<int> > q1;
queue<int, list<int> > q2(q1);
元素入隊
queue 隊列容器的元素入隊函數也是 push 函數。由於 C++ STL 的 queue 隊列不預設固定的隊列大小,因此 push 函數也就不能判斷隊列控件是否已滿,都會試圖將元素放入隊列,因此 push 函數不會返回元素入隊是否成功的信息。
void push(const value_type& x)
元素出對
queue 隊列容器的元素出對函數為 pop 函數。函數不判斷隊列是否為空,都試圖將隊首元素刪除掉。一般先判斷隊列不為空,才使用該函數進行元素出對操作。
void pop()
取隊首、尾元素
queue 隊列容器的 front 函數和 back 函數,可分別讀取隊首和隊尾元素。
1. value_type& front() // 讀取隊列的隊首元素
2. value_type& back() // 讀取隊列的隊尾元素
隊列非空的判斷
從上面看到,很多 queue 隊列的操作都要用到 empty 函數,判斷不斷入隊和出對的隊列是否為空,再做下一步的處理。
bool empty()
1 ----------------------------------------- 獲取 queue 隊列的所有元素 2 #include <queue> 3 #include <iostream> 4 using namespace std; 5 int main() 6 { 7 // 創建 queue 對象 8 queue<int> q; 9 // 元素入隊 10 q.push(3); 11 q.push(19); 12 q.push(29); 13 q.push(26); 14 q.push(33); 15 // 元素出對 16 while (!q.empty()) 17 { 18 // 打印隊首元素(取隊首) 19 cout << q.front() << ' '; 20 // 刪除隊首元素 21 q.pop(); 22 } 23 24 cout << endl; 25 26 return 0; 27 }
1 /* 隊列的大小 2 隊列的元素個數可用 size 函數獲取。如果每次元素入隊前,都先檢查當前隊列的元素個數,以此判斷是否再允許元素入隊,那么就可實現一個具有固定長隊的隊列。如下是 size 函數的使用原型: 3 size_type size() 4 5 下面的示例程序,將 queue 隊列的長隊設置為 50 個 int 元素,並使用 list 雙向鏈表作底層結構,每當元素入隊時,都調用 size 函數檢查長度是否會超過限定的長度界限,實現一個固定大小的 queue 隊列。 6 */ 7 8 ----------------------------------------- 固定長度的 queue 隊列 9 #include <queue> 10 #include <list> 11 #include <iostream> 12 #define QUEUE_SIZE 50 13 14 using namespace std; 15 int main() 16 { 17 // 用雙向鏈表作 queue 隊列的底層容器 18 queue<int, list<int> > q; 19 if (q.size() < QUEUE_SIZE) 20 q.push(51); 21 if (q.size() < QUEUE_SIZE) 22 q.push(36); 23 if (q.size() < QUEUE_SIZE) 24 q.push(28); 25 if (q.size() < QUEUE_SIZE) 26 q.push(1); 27 // 元素出對 28 while (!q.empty()) 29 { 30 // 打印 51 36 28 1 31 cout << q.front() << " "; 32 // 出對 33 q.pop(); 34 } 35 36 cout << endl; 37 38 return 0; 39 }
-------------------------- queue 小結
隊列也是一種常用的數據結構,通常以消息隊列的形式應用與進程間的通信。C++ STL 提供的 queue 容器隊列的數據結構和受限操作進行了泛化封裝,包括隊列初始化、元素入隊、取隊首元素、元素出對、隊列是否為空以及獲取當前隊列長度等操作。
與堆棧一樣,queue 隊列也是默認使用 queue 雙端隊列作底層架構,元素的出對也不返回隊首元素,需要先用取隊首函數將之讀出。通過檢查當前隊列長度,來決定是否允許元素入隊,可實現具有固定長度的隊列。
