数据结构之队列·循环队列
参考书籍:严蔚敏《数据结构》
事先应知小知识:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *ch = (char*)malloc(sizeof(char));
ch[0] = 'a';
ch[1] = 'b';
ch[2] = 'c';
for(int i = 0;i<3;i++)
printf("ch[%d] = %c\n",i,ch[i]);
return 1;
}
循环队列使用游标模拟指针。当循环队列为空时,Q.front 等于 Q.rear,当队列满时,Q.front也等于Q.rear。所以此处空出最后一个元素,当表示结尾的指针rear加1等于头指针front时,头尾指针相遇,表示循环队列已经满了,不能再放入数据。
本例中插入12个元素,最大空间只有10个(MAXSIZE = 10),由于空着一个来元素来判断空还是满,故只能插入9个数据,3个数据插入失败。
//循环队列
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
typedef struct{
char *base;//初始化的动态分配存储空间
int front;//头指针,队列不空时指向头元素
int rear;//尾指针,队列不空时指向尾元素
}sqQueue;
//初始化结构体,为结构体中的指针变量base分配内存
int initQueue(sqQueue* Q)
{
Q->base = (char*)malloc(MAXSIZE*sizeof(char));
if(!Q->base)return 0;
Q->front = Q->rear = 0;
return 1;
}
int QueueLength(sqQueue* Q)
{
return (Q->rear - Q->front + MAXSIZE)%MAXSIZE;
}
//插入一个元素ch,插入之前判断循环队列是否已满。
int enQueue(sqQueue* Q,char ch)
{
if((Q->rear+1)%MAXSIZE == Q->front){printf("insert failed!\n");return 0;}
Q->base[Q->rear] = ch;
Q->rear = (Q->rear+1)%MAXSIZE;
return 1;
}
//删除一个元素,并用参数ch存储删除的元素。当头指针和尾指针相等,说明队列为空
int deQueue(sqQueue* Q,char *ch)
{
if(Q->front == Q->rear)return 0;
*ch = Q->base[Q->front];
Q->front = (Q->front + 1)%(MAXSIZE);
return 1;
}
//显示该队列所有元素。如果队列为空,返回。
void display(sqQueue Q)
{
if(Q.rear == Q.front){printf("empty queue!\n");return;}
do{
printf("%2d ---- >%c\n",Q.front,Q.base[Q.front]);
Q.front = Q.front + 1;
}while(Q.front != Q.rear);
printf("\ndisplay over\n");
}
int main()
{
sqQueue Queue;
char c;
printf("sizeof(Queue) = %d\n",sizeof(Queue));//一个结构体的大小,等于4+4+8 = 16;
initQueue(&Queue);
for(int j = 0;j<12;j++)
enQueue(&Queue,'a'+j);
//MAXSIZE的大小是10,那么for循环中将有3个元素无法插入
display(Queue);
deQueue(&Queue,&c);//删除第一个元素
display(Queue);
return 1;
}

若觉得脑子糊涂了,请看看数据结构的循环队列部分的内容,多多领会。

浙公网安备 33010602011771号