打印
[牛人杂谈]

循环队列的用法

[复制链接]
196|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wahahaheihei|  楼主 | 2024-2-27 15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
typedef struct {
    int buffer[SIZE];
    int head;
    int tail;
    int count;
} CircularBuffer;

void push(CircularBuffer *cb, int data) {
    if (cb->count < SIZE) {
        cb->buffer[cb->head] = data;
        cb->head = (cb->head + 1) % SIZE;
        cb->count++;
    }
}

int pop(CircularBuffer *cb) {
    if (cb->count > 0) {
        int data = cb->buffer[cb->tail];
        cb->tail = (cb->tail + 1) % SIZE;
        cb->count--;
        return data;
    }
    return -1; // Buffer is empty
}


使用特权

评论回复
沙发
wahahaheihei|  楼主 | 2024-2-27 15:42 | 只看该作者
循环队列是一种高效的数据结构,适用于缓冲区和数据流应用,例如串口通信接收缓冲。

使用特权

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

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

#define MAX_SIZE 10

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

// 初始化循环队列
CircularQueue* createQueue() {
    CircularQueue* queue = (CircularQueue*)malloc(sizeof(CircularQueue));
    queue->array = (int*)malloc(MAX_SIZE * sizeof(int));
    queue->front = 0;
    queue->rear = 0;
    queue->capacity = MAX_SIZE;
    return queue;
}

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

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

// 打印队列元素
void printQueue(CircularQueue* queue) {
    printf("Queue: ");
    int i = queue->front;
    while (i != queue->rear) {
        printf("%d ", queue->array[i]);
        i = (i + 1) % queue->capacity;
    }
    printf("\n");
}

int main() {
    CircularQueue* queue = createQueue();

    enqueue(queue, 10);
    enqueue(queue, 20);
    enqueue(queue, 30);
    printQueue(queue);

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

    free(queue->array);
    free(queue);
    return 0;
}

使用特权

评论回复
地板
wahahaheihei|  楼主 | 2024-2-27 15:47 | 只看该作者
在这个示例中,我们通过一个数组来存储循环队列的元素,通过 front 和 rear 指针来表示队列的头和尾。enqueue() 和 dequeue() 分别用于入队和出队操作,利用取模运算来实现指针的循环移动。




使用特权

评论回复
5
21mengnan| | 2024-2-27 21:35 | 只看该作者
环形队列吗?

使用特权

评论回复
6
21mengnan| | 2024-2-27 21:35 | 只看该作者
链表的用法,是吧?

使用特权

评论回复
7
xixi2017| | 2024-2-28 11:49 | 只看该作者
压栈出栈的感觉。

使用特权

评论回复
8
yiy| | 2024-2-28 16:10 | 只看该作者
不是特别像链表啊。

使用特权

评论回复
9
dongnanxibei| | 2024-2-28 19:18 | 只看该作者
这个主要用于什么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

200

主题

2982

帖子

12

粉丝