21 循环队列
Posted abel2020
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21 循环队列相关的知识,希望对你有一定的参考价值。
#include <stdio.h> #include <stdbool.h> #include <stdlib.h> //exit 函数需要 #include <malloc.h> #define MAXSIZE 8 typedef struct queue { int* arr; //int 类型数组,arr数组名 int head; //队头 int rear; //队尾后一个元素 }QUEUE; //函数原型 bool init_queue(QUEUE* queue); bool enqueue(QUEUE* queue, int val); //入队 bool dequeue(QUEUE* queue, int* val); //出队 bool is_empty(QUEUE* queue); bool is_full(QUEUE* queue); void show_queue(QUEUE* queue); //测试程序 main() { bool is_em = 1, is_fu = 0; QUEUE queue; int val; //出队的int; init_queue(&queue); enqueue(&queue, -200100); enqueue(&queue, 12); enqueue(&queue, 13); enqueue(&queue, 14); enqueue(&queue, 15); enqueue(&queue, 116); enqueue(&queue, 117); enqueue(&queue, 1118); enqueue(&queue, 1119); enqueue(&queue, 11114); show_queue(&queue); is_em = is_empty(&queue); is_fu = is_full(&queue); dequeue(&queue, &val); printf("dequeue val=%d", val); printf(" is_em=%d, is_full=%d ", is_em, is_fu); } bool init_queue(QUEUE* queue) { queue->arr = (int*)malloc(sizeof(int) * MAXSIZE); // 注意: 是创建int 的存储空间,不是对结构体! if (NULL == queue->arr) //申请失败 exit(-1); queue->head = 0; //起始都为0 queue->rear = 0; } bool enqueue(QUEUE* queue, int val) { if (is_full(queue)) return false; else { queue->arr[queue->rear] = val; queue->rear = (queue->rear + 1) % MAXSIZE; //循环队列队头自加 } } bool dequeue(QUEUE* queue, int* val) { if (is_empty(queue)) return false; else { *val = queue->arr[queue->head]; queue->head = (queue->head + 1) % MAXSIZE; //循环队列队后自加 } } bool is_empty(QUEUE* queue) { if (queue->head == queue->rear) //如果相等就是空,因为还剩一个空间就是队满了,所以不会和对满冲突 return true; else return false; } bool is_full(QUEUE* queue) { if (queue->head == (queue->rear + 1) % MAXSIZE) //还剩一个空间就是队满了 return true; //循环队列可以理解为head 在追rear, rear 在追head else return false; } void show_queue(QUEUE* queue) { int i; i = queue->head; printf("queue: "); while (i != queue->rear) { printf("%d ", queue->arr[i]); i = (i + 1) % MAXSIZE; } printf(" "); }
以上是关于21 循环队列的主要内容,如果未能解决你的问题,请参考以下文章