队列是一种特殊的线性表,只允许在表的前端front进行删除操作,在表的后端rear进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,今次那个删除操作的端称为队头。
基本特征:先进先出(FIFO)
基本操作:压入,弹出
实现要点:初始化空间,前指针front弹出后指针rear压入,循环使用,判空判满
举例1:基于数组的队列
//队列
typedef struct Queue{
int *array;
size_t cap;
size_t front;
size_t rear;
size_t size;
} Myqueue;
//分配内存并初始化为空队列
void queueInit(Myqueue *queue,size_t cap){
queue->array = malloc(cap *sizeof(int));
queue->cap = cap;
queue->front = 0;
queue->rear = 0;
queue->size = 0;
}
//释放内存并恢复到初始状态
void queueDestroy(Myqueue *queue){
free(queue->array);
queue->array = NULL;
queue->cap = 0;
queue->front = 0;
queue->rear = 0;
queue->size = 0;
}
//判满
int queueFull(Myqueue *queue){
return queue->size >= queue->cap;
}
//判空
int queueEmpty(Myqueue *queue){
return ! queue->size;
}
//压入
void queuePush(Myqueue *queue,int data){
if (queue->rear >= queue->cap) {
queue->rear = 0;
}
++ queue->size;
queue->array[queue->rear ++] = data;
}
//弹出
int queuePop(Myqueue *queue){
if (queue->front >= queue->cap) {
queue->front = 0;
}
-- queue->size;
return queue->array[queue->front ++];
}
//队首
int queueFront(Myqueue *queue){
if (queue->front >= queue->cap) {
queue->front = 0;
}
return queue->array[queue->front];
}
//数量
size_t queueSize(Myqueue *queue){
return queue->size;
}
int main(){
Myqueue *queue;
queueInit(queue, 4);
queuePush(queue, 50);
queuePush(queue, 60);
queuePush(queue, 70);
queuePush(queue, 80);
printf("%s\r\n",queueFull(queue) ? "full" : "empty");
printf("%d\r\n",queuePop(queue));
printf("%d\r\n",queuePop(queue));
queuePush(queue, 90);
queuePush(queue, 100);
printf("%d\r\n",queuePop(queue));
printf("%d\r\n",queuePop(queue));
printf("%d\r\n",queuePop(queue));
printf("%d\r\n",queuePop(queue));
queueDestroy(queue);
return 0;
}