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;
}
};