>>创建队列对象:queue<元素类型>队列名;
队列添加元素:队列名.push(元素名);
去掉队首元素:队列名.pop();
访问队首元素:队列名.front();
访问队尾元素:队列名.back();
判断是否为空:队列名.empty();
返回队列大小:队列名.size();
//实例代码
int a,b,c,d;
queue<int> q;
q.push(1);q.push(3);q.push(4);q.pop();
a=q.front();
b=q.back();
c=q.size();
d.empty();//boolean类型
count<<a<<' '<<b<<''<<c<<''<<d<<''<<endl;
//3 4 2 0
算法思想:维护一个队列,用于存放节点的信息。当访问到一个节点的时候, 先访问该节点,然后将该节点的左右儿子分别存放入队列。
>ccbl(int root)//先进先出的特点
queue<int >Q;创建一个队列
Q.push(root);将根节点入队列
while(队列不为空){
获得队首元素
将队首元素出队
输出当前节点的值
如果该节点的左儿子不为空,将左儿子加入到队列中
如果该节点的右儿子不为空,将左儿子加入到队列中
}
BFS最常见的剪枝方案是数组做标记;
>>伪代码
Node bfs(node source,node target){
memset(visit,0,sizeof(visit));
queue<node> Q;
Q.push(source);
visit[source]=1;
while(!Q.empty()){
Node a=Q.front();
Q.pop();
if(a==target){
return a;
}
for(对于a所有的后继节点b)
if(visit[b]){
continue;
}
Q.push(b);
visit[b]=1;
}
return NULL;
}
例子:
void bfs(){
pos cur,nex;
cur.level=Start;
cur.steps=0;
queue<pos>qu;
qu.push(cur);
vis[Start]=1;
while(!qu.empty()){
cur=qu.front();
qu.pop();
if(cur.level==End){
printf("%d\n",cur.steps);
return ;
}
nex.level=cur.level+a[cur.level];
nex.steps=cur.steps+1;
if(nex.level<=N){
if(vis[nex.level]==0){
vis[nex.level]=1;
qu.push(nex);
}
}
nex.level=cur.level-a[cur.level];
nex.steps=cur.steps+1;
if(nex.level>=1){
if(vis[nex.level]==0){
vis[nex.level]=1;
qu.push(nex);
}
}
}
printf("-1\n");
return ;
}