STL學習筆記-- queue



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 雙端隊列作底層架構,元素的出對也不返回隊首元素,需要先用取隊首函數將之讀出。通過檢查當前隊列長度,來決定是否允許元素入隊,可實現具有固定長度的隊列。


免責聲明!

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



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