[牛人杂谈] 循环队列的用法

[复制链接]
789|8
 楼主| wahahaheihei 发表于 2024-2-27 15:42 | 显示全部楼层 |阅读模式
ar, DA, AI, AD, he, buffer
  1. typedef struct {
  2.     int buffer[SIZE];
  3.     int head;
  4.     int tail;
  5.     int count;
  6. } CircularBuffer;

  7. void push(CircularBuffer *cb, int data) {
  8.     if (cb->count < SIZE) {
  9.         cb->buffer[cb->head] = data;
  10.         cb->head = (cb->head + 1) % SIZE;
  11.         cb->count++;
  12.     }
  13. }

  14. int pop(CircularBuffer *cb) {
  15.     if (cb->count > 0) {
  16.         int data = cb->buffer[cb->tail];
  17.         cb->tail = (cb->tail + 1) % SIZE;
  18.         cb->count--;
  19.         return data;
  20.     }
  21.     return -1; // Buffer is empty
  22. }


 楼主| wahahaheihei 发表于 2024-2-27 15:42 | 显示全部楼层
循环队列是一种高效的数据结构,适用于缓冲区和数据流应用,例如串口通信接收缓冲。

 楼主| wahahaheihei 发表于 2024-2-27 15:47 | 显示全部楼层
循环队列是一种基于数组的队列实现方式,其特点是队列的两端相连成环状。这使得在队列头尾移动时无需搬移元素,只需要调整队头和队尾指针即可。C 语言中可以通过数组和指针来实现循环队列。

以下是一个简单的循环队列的实现示例:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define MAX_SIZE 10

  4. // 定义循环队列结构体
  5. typedef struct {
  6.     int *array;   // 存储队列元素的数组
  7.     int front;    // 队头指针,指向队首元素
  8.     int rear;     // 队尾指针,指向队尾元素的下一个位置
  9.     int capacity; // 队列的最大容量
  10. } CircularQueue;

  11. // 初始化循环队列
  12. CircularQueue* createQueue() {
  13.     CircularQueue* queue = (CircularQueue*)malloc(sizeof(CircularQueue));
  14.     queue->array = (int*)malloc(MAX_SIZE * sizeof(int));
  15.     queue->front = 0;
  16.     queue->rear = 0;
  17.     queue->capacity = MAX_SIZE;
  18.     return queue;
  19. }

  20. // 入队操作
  21. void enqueue(CircularQueue* queue, int value) {
  22.     // 检查队列是否已满
  23.     if ((queue->rear + 1) % queue->capacity == queue->front) {
  24.         printf("Queue is full. Enqueue operation failed.\n");
  25.         return;
  26.     }
  27.     queue->array[queue->rear] = value;
  28.     queue->rear = (queue->rear + 1) % queue->capacity;
  29. }

  30. // 出队操作
  31. int dequeue(CircularQueue* queue) {
  32.     // 检查队列是否为空
  33.     if (queue->front == queue->rear) {
  34.         printf("Queue is empty. Dequeue operation failed.\n");
  35.         return -1; // 返回一个特殊值表示出错
  36.     }
  37.     int value = queue->array[queue->front];
  38.     queue->front = (queue->front + 1) % queue->capacity;
  39.     return value;
  40. }

  41. // 打印队列元素
  42. void printQueue(CircularQueue* queue) {
  43.     printf("Queue: ");
  44.     int i = queue->front;
  45.     while (i != queue->rear) {
  46.         printf("%d ", queue->array[i]);
  47.         i = (i + 1) % queue->capacity;
  48.     }
  49.     printf("\n");
  50. }

  51. int main() {
  52.     CircularQueue* queue = createQueue();

  53.     enqueue(queue, 10);
  54.     enqueue(queue, 20);
  55.     enqueue(queue, 30);
  56.     printQueue(queue);

  57.     int dequeued = dequeue(queue);
  58.     printf("Dequeued element: %d\n", dequeued);
  59.     printQueue(queue);

  60.     free(queue->array);
  61.     free(queue);
  62.     return 0;
  63. }
 楼主| wahahaheihei 发表于 2024-2-27 15:47 | 显示全部楼层
在这个示例中,我们通过一个数组来存储循环队列的元素,通过 front 和 rear 指针来表示队列的头和尾。enqueue() 和 dequeue() 分别用于入队和出队操作,利用取模运算来实现指针的循环移动。




21mengnan 发表于 2024-2-27 21:35 | 显示全部楼层
环形队列吗?
21mengnan 发表于 2024-2-27 21:35 | 显示全部楼层
链表的用法,是吧?
xixi2017 发表于 2024-2-28 11:49 | 显示全部楼层
压栈出栈的感觉。
yiy 发表于 2024-2-28 16:10 | 显示全部楼层
不是特别像链表啊。
dongnanxibei 发表于 2024-2-28 19:18 | 显示全部楼层
这个主要用于什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

234

主题

3227

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部