之前用队列的时候,实现方式很简陋:一维数组+两个指针。现在先规范的写出队列的所有函数的算法,然后放到一个头文件中,直接调用函数。一开始很不习惯,主要是以前编程都是等到要什么功能的函数就地编写。后来看到C++中一些关于代码重用的说法,再想想自己确实写了很多功能相似的函数也即做了很多无用功。于是狠下心来,把数据结构中存储结构的函数功能和经常使用的一些函数都实现,放到头文件中,以后直接调用。
其实广度优先的原理都是一样的(迷宫的广度,二叉树的层序……),就是用队列,然后不停的将与要出队的结点有关联的结点入队(这个有点难说明白,表达能力有待提高……),直到队空。
//图:邻接矩阵:广度优先遍历
#include<iostream>
#include<cstdlib>
using namespace std;
#include"Queue.h" // 队列
const int size=9;
struct ArcCell{
bool Matrix[size][size]; //邻接矩阵
int VexNum; //图的顶点数
};
struct ArcCell G;
bool sign[size];
void BreFirst(struct Queue &Q);
int main()
{
const int sidenum=14;
int map[sidenum][2]={{0,1},{0,5},{1,2},{1,8},
{1,6},{2,3},{2,8},{3,4},
{3,7},{3,8},{4,5},{4,7},
{5,6},{6,7}};
for(int i=0;i<sidenum;i++)
G.Matrix[map[i][0]][map[i][1]]=TRUE;
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
cout<<G.Matrix[i][j]<<' ';
cout<<endl;
}
cout<<endl;
for(int i=0;i<size;i++)
sign[i]=FALSE;
struct Queue Q;
IniQueue(Q);
int i=0;
InQueue(Q,i);
sign[i]=TRUE;
for(;i<size;i++)
BreFirst(Q);
DestroyQueue(Q);
return 0;
}
void BreFirst(struct Queue &Q)
{
if(QueueEmpty(Q)) return;
int tmp;
OutQueue(Q,tmp);
cout<<tmp<<' ';
for(int j=0;j<size;j++)
if(G.Matrix[tmp][j]==TRUE
&&sign[j]==FALSE)
{
InQueue(Q,j);
sign[j]=TRUE;
}
}
//数据结构:队列
#include<iostream>
using namespace std;
typedef int DataType;
const int FIRSTSIZE=100;
const bool TRUE=1;
const bool FALSE=0;
struct Queue
{
DataType *data;
int length; //已存数据个数
int size_; //可存数据个数
};
void IniQueue(struct Queue &Q); //构造空队列
void DestroyQueue(struct Queue &Q); //销毁队列
bool InQueue(struct Queue &Q,DataType &data);
bool OutQueue(struct Queue &Q,DataType &data);
bool QueueEmpty(struct Queue &Q);
void IniQueue(struct Queue &Q)
{
Q.data=new DataType [FIRSTSIZE];
Q.length=0;
Q.size_=FIRSTSIZE;
}
void DestroyQueue(struct Queue &Q)
{
if(!Q.data) return;
delete [] Q.data;
Q.data=NULL;
Q.length=0;
Q.size_=0;
}
bool InQueue(struct Queue &Q,DataType &data)
{
if(Q.length==FIRSTSIZE)
return FALSE;
Q.data[Q.length]=data;
++Q.length;
return TRUE;
}
bool OutQueue(struct Queue &Q,DataType &data)
{
if(Q.length==0)
return FALSE;
data=Q.data[0];
--Q.length;
for(int i=0;i<Q.length;i++)
Q.data[i]=Q.data[i+1];
return TRUE;
}
bool QueueEmpty(struct Queue &Q)
{
if(Q.length==0)
return TRUE;
else
return FALSE;
}