此处的链式与循环队列可以应用于BFS和树的层序遍历。下面是对其结构和基本操作的程序描述。
1、循环队列
解决循环队列的队空和队满的方法:
[1].增加一个参数count,用来记录数组中当前元素的个数;
[2].为避免队空和满两状态混淆,少用一个存储空间,也就是数组最后一个存数空间不用,(rear+1)% QSIZE= front 时, 队满;
a)判断是否为空队列:front==rear; b)判断队列是否已满:front=(rear+1)%size;
1 typedef struct{ //队列结构定义 2 int front; 3 int rear; 4 int count; //队列元素计数 5 int key[QSIZE]; 6 }BFSQueue; 7 8 void InitBFSQueue(BFSQueue *BFSQ) //队列初始化 9 { 10 BFSQ->front=0; //front指向队列第一个元素 11 BFSQ->rear=0; //rear指向队列中下一个空位 12 BFSQ->count=0; 13 } 14 int EmptyBFSQueue(BFSQueue *BFSQ) //空 15 { 16 return BFSQ->count==0; 17 } 18 int FullBFSQueue(BFSQueue *BFSQ) //满 19 { 20 return BFSQ->count==QSIZE; 21 } 22 23 void AddBFSQueue(BFSQueue *BFSQ,int num) //插入 24 { 25 if(!FullBFSQueue(BFSQ)) 26 { 27 BFSQ->count++; 28 BFSQ->key[BFSQ->rear]=num; 29 BFSQ->rear=(BFSQ->rear+1) % QSIZE; 30 } 31 } 32 33 int DelBFSQueue(BFSQueue *BFSQ) //删除 34 { 35 int temp; 36 if(!EmptyBFSQueue(BFSQ)) 37 { 38 BFSQ->count--; 39 temp=BFSQ->key[BFSQ->front]; 40 BFSQ->front=(BFSQ->front+1) % QSIZE; 41 return temp; 42 } 43 else 44 return NULL; 45 } 46 /******************************************************************/
2、链式队列
1 typedef struct QNode{ // 队列元素结构 2 int key; 3 struct QNode *next; 4 }QNode; 5 typedef struct{ // 队列结构 6 QNode *front; 7 QNode *rear; 8 int count; 9 }BFSQueue; 10 11 void InitBFSQueue(BFSQueue *BFSQ) //队列初始化 12 { 13 BFSQ->front=NULL; 14 BFSQ->rear=NULL; 15 BFSQ->count=0; 16 } 17 int EmptyBFSQueue(BFSQueue *BFSQ) //空 18 { 19 return BFSQ->count==0; 20 } 21 22 void AddBFSQueue(BFSQueue *BFSQ,int num) //插入 23 { 24 QNode *np=(QNode *)malloc(sizeof(QNode)); 25 np->key=num; 26 np->next=NULL; 27 //BFSQ->count++; 28 29 if(!EmptyBFSQueue(BFSQ)) // 队列非空 30 { 31 BFSQ->rear->next=np; 32 BFSQ->rear=np; 33 } 34 else // 队列空 35 { 36 BFSQ->rear=np; 37 BFSQ->front=np; 38 } 39 BFSQ->count++; 40 } 41 int DelBFSQueue(BFSQueue *BFSQ) //删除 42 { 43 int temp; 44 QNode *tp=(QNode *)malloc(sizeof(QNode)); 45 if(!EmptyBFSQueue(BFSQ)) //队列非空 46 { 47 //BFSQ->count--; //////注意,必须在队列判定之后增加或减小count的值/////// 48 tp=BFSQ->front; 49 temp=tp->key; 50 if(BFSQ->count==1) //出队后队列为空 51 { 52 BFSQ->rear=NULL; 53 BFSQ->front=NULL; 54 } 55 else //出队后队列非空 56 { 57 BFSQ->front=tp->next; 58 } 59 BFSQ->count--; 60 free(tp); //释放暂存指针 61 62 return temp; 63 } 64 else 65 return NULL; 66 }