c++重拾STL之 隊列:queue、deque

queue

頭文件#include<queue>
queue模板類兩個模板參數:一個是元素類型,一個是容器類型,容器類型默認爲deque類型。

1、定義queue對象:

queue<int> q1;
queue<BTNode*> q2

2、queue的基本操作

  • 入隊: q.push(x); 入到隊尾
  • 出隊:q.pop(); 彈出隊列第一個元素,**注意,pop出隊只是刪除隊頭元素,並不會返回被彈出的元素!!!和stack的pop一樣**
  • 訪問隊首元素:q.front(); 即最早被壓入隊列的元素
  • 訪問隊尾元素:q.back(); 即最後被亞茹隊列的元素
  • 判斷隊空:q.empty(); 當隊列空時,返回true
  • 隊中元素個數:q.size();

雙向隊列deque

頭文件#include<deque>
兩端的每一端都既可以刪除也可以添加元素 / 頭尾兩端都可以增刪元素。
(queue要是在A端添加的話,就只能在B端刪)

deque和vector一樣,都是採用動態數組來管理元素。
deque兩端都能夠快速插入和刪除元素。vector只能一頭。

1、定義deque對象

deque<string> dq

2、deque的基本操作

  • dq.front(): 訪問第一個元素
  • dq.back():訪問最後一個元素
  • dq.push_front(x): 從隊頭入隊/ 添加元素到隊頭
  • dq.push_back(x): 從隊尾入隊/ 添加元素到隊尾
  • dq.pop_front(): 從隊頭出隊/ 刪除隊頭的元素
  • dq.pop_back(): 從隊尾出隊/ 刪除隊尾的元素
  • dq.empty()
  • dq.size()

使用示例:

二叉樹層次遍歷:
一般直接用deque。deque的功能比queue更全。

class Solution {
    //層次遍歷: 用隊列
public:
    vector<int> PrintFromTopToBottom(TreeNode* root) {
       
        
        vector<int> res;//問題要求要用vector<int>返回
         if(root==nullptr)    return res;
        
        deque<TreeNode*> dq;
        dq.push_front(root);//先把頭添加到隊裏
        while(!dq.empty()){
            //訪問隊頭/打印隊頭(輸出結果)
            TreeNode* pNode= dq.front();
            res.push_back(pNode->val);
            //隊頭出去
            dq.pop_front();
            
            //孩子進來
            if(pNode->left)
                dq.push_back(pNode->left);
            if(pNode->right)
                dq.push_back(pNode->right);
        }
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章