C++STL常用操作之queue篇
阿新 • • 發佈:2021-02-06
技術標籤:STLSTL簡單使用快速上手二叉樹佇列二叉樹資料結構演算法
STL常用操作之queue篇
簡介:
佇列,其特點是first in first out(先進先出),從對頭出隊,從隊尾入隊。
這裡可以和stack做一些比較
#include<queue>
佇列對於某些問題的處理也是很方便的,比如廣度優先搜尋,這個我們在文章末尾給出一道簡單的題目,大家可以試試。
1.構造
queue<int> qq;
qq.push(2); //整形資料2入隊
qq.push(3); //整形資料3入隊
此時佇列qq如圖所示:
2.常用函式
qq.push(3); //整形資料3入隊
cout << qq.front(); //輸出佇列的對頭元素
qq.pop(); //將對頭元素出隊
int length = qq.size(); //返回值為佇列的長度
if(qq.empty()); //bool型別,判斷佇列是否為空
3.應用
這裡列舉一個二叉樹層次遍歷的問題。
問題描述
編一個程式,讀入使用者輸入的一串先序遍歷字串,根據此字串建立一個二叉樹。例如如下的先序遍歷字串:ABC##DE#G##F### ,其中“#”表示的是空格,空格字元代表空樹。建立起此二叉樹以後,再對二叉樹進行層序遍歷,輸出遍歷結果。
輸入形式
輸入包括1行字串,長度不超過100。
輸出形式
可能有多組測試資料,對於每組資料,每個字元後面都有一個空格,每個輸出結果佔一行。
樣例輸入
abc##de#g##f###
樣例輸出
a b c d e f g
#include<iostream>
#include<queue>
using namespace std;
struct bi_tree_node {
char data; //資料域
bi_tree_node* left; //左孩子
bi_tree_node* right; //右孩子
};
//二叉樹的節點
bi_tree_node* build() {
char data;
cin >> data;
bi_tree_node* r = new bi_tree_node;
if (data == '#')
r = NULL;
//如果輸入的字元為#,則為空
else {
r->data = data;
r->left = build();
r->right = build();
}
//否則,繼續遞迴構造它的左子樹和右子樹
return r;
}
//構造二叉樹
void bfs(bi_tree_node* root) {
queue<bi_tree_node*> qq;
qq.push(root);
while (!qq.empty()) {
root = qq.front();
qq.pop();
cout << root->data; //彈出根節點並且輸出
if (root->left != NULL)
qq.push(root->left); //如果左子樹不為空,則將左子樹的根節點入隊
if (root->right != NULL)
qq.push(root->right); //右子樹同上
}
}
//廣度優先搜尋完成二叉樹的層次遍歷
int main() {
bi_tree_node* root = build();
bfs(root);
return 0;
}
執行結果:
這個題目的寫法是根據前序遍歷構建二叉樹,build函式也就是遞迴,這裡可以和之前stack篇中提到的遞迴相結合起來學習。
另外,基本瞭解廣搜原理過後也可以開始上手類似於低階版“抓奶牛”的題目。
queue簡單使用,適用於像我這樣的小白快速上手,大神請鍵下留情!
發現問題歡迎指正!
希望能幫助到你!不懂留言!