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简单使用,适用于像我这样的小白快速上手,大神请键下留情!
发现问题欢迎指正!
希望能帮助到你!不懂留言!