C语言实现队列

队列是一种常用的数据结构,它是一种先进先出(FIFO)的线性表,也就是说,只能在一端(称为队尾)插入元素,而在另一端(称为队头)删除元素。队列的应用场景很多,比如操作系统中的进程调度、网络中的数据包传输、打印机的任务缓冲等等。

本文将介绍如何用 C 语言实现一个简单的队列,并给出相关的代码和测试示例。

队列的定义

要实现一个队列,我们首先需要定义一个队列的结构体,它包含以下几个成员:

  • data:一个数组,用来存储队列中的元素。
  • front:一个整数,表示队头元素的下标。
  • rear:一个整数,表示队尾元素的下标。
  • maxsize:一个整数,表示队列的最大容量。
// 队列的结构体定义
typedef struct Queue {
    int *data; // 队列元素数组
    int front; // 队头下标
    int rear; // 队尾下标
    int maxsize; // 队列最大容量
} Queue;

队列的初始化

要初始化一个队列,我们需要分配一定大小的内存空间给 data 数组,并将 frontrear 都设为 -1,表示队列为空。同时,我们需要传入一个参数 size,表示队列的最大容量,并将其赋值给 maxsize

// 队列的初始化函数
Queue *initQueue(int size) {
    Queue *q = (Queue *)malloc(sizeof(Queue)); // 分配内存空间给队列结构体
    q->data = (int *)malloc(sizeof(int) * size); // 分配内存空间给队列元素数组
    q->front = -1; // 设置队头下标为 -1
    q->rear = -1; // 设置队尾下标为 -1
    q->maxsize = size; // 设置队列最大容量为 size
    return q; // 返回队列指针
}

队列的判空和判满

要判断一个队列是否为空,我们只需要检查 frontrear 是否相等。如果相等,说明队列为空;否则,说明队列不为空。

// 队列的判空函数
int isEmpty(Queue *q) {
    return q->front == q->rear; // 如果队头下标等于队尾下标,返回 1;否则返回 0
}

要判断一个队列是否已满,我们需要考虑两种情况:

  • 如果 rear + 1 == maxsize,说明队尾已经到达数组的最后一个位置,且数组已经被填满。
  • 如果 rear + 1 == front,说明队尾已经绕回到数组的第一个位置,且数组已经被填满。
// 队列的判满函数
int isFull(Queue *q) {
    return (q->rear + 1) % q->maxsize == q->front; // 如果 (队尾下标 + 1) 对最大容量取余等于队头下标,返回 1;否则返回 0
}

队列的入队和出队

要实现一个元素入队,我们需要先判断队列是否已满。如果已满,则无法入队;否则,将元素放入 rear + 1 的位置,并更新 rear 的值。注意,这里我们使用了取余运算符 % 来实现循环数组的效果。

// 队列的入队函数
void enqueue(Queue *q, int x) {
    if (isFull(q)) { // 如果队列已满,打印错误信息并返回
        printf("Queue is full!\n");
        return;
    }
    q->rear = (q->rear + 1) % q->maxsize; // 更新队尾下标
    q->data[q->rear] = x; // 将元素放入队尾位置
}

要实现一个元素出队,我们需要先判断队列是否为空。如果为空,则无法出队;否则,将 front + 1 的位置的元素返回,并更新 front 的值。同样,这里我们使用了取余运算符 % 来实现循环数组的效果。

// 队列的出队函数
int dequeue(Queue *q) {
    if (isEmpty(q)) { // 如果队列为空,打印错误信息并返回 -1
        printf("Queue is empty!\n");
        return -1;
    }
    q->front = (q->front + 1) % q->maxsize; // 更新队头下标
    return q->data[q->front]; // 返回队头位置的元素
}

队列的测试

为了测试我们实现的队列是否正确,我们可以编写一个简单的测试程序,如下:

// 队列的测试程序
int main() {
    Queue *q = initQueue(5); // 初始化一个最大容量为 5 的队列
    enqueue(q, 1); // 入队元素 1
    enqueue(q, 2); // 入队元素 2
    enqueue(q, 3); // 入队元素 3
    printf("%d\n", dequeue(q)); // 出队元素,打印 1
    printf("%d\n", dequeue(q)); // 出队元素,打印 2
    enqueue(q, 4); // 入队元素 4
    enqueue(q, 5); // 入队元素 5
    enqueue(q, 6); // 入队元素 6
    enqueue(q, 7); // 尝试入队元素 7,打印错误信息
    printf("%d\n", dequeue(q)); // 出队元素,打印 3
    printf("%d\n", dequeue(q)); // 出队元素,打印 4
    printf("%d\n", dequeue(q)); // 出队元素,打印 5
    printf("%d\n", dequeue(q)); // 出队元素,打印 6
    printf("%d\n", dequeue(q)); // 尝试出队元素,打印错误信息并返回 -1
    return 0;
}

运行结果如下:

1
2
Queue is full!
3
4
5
6
Queue is empty!
-1

可以看到,我们实现的队列符合预期的功能和逻辑。

本文介绍了如何用 C 语言实现一个简单的队列,并给出了相关的代码和测试示例。希望这篇文章对你有所帮助。如果你有任何问题或建议,欢迎在评论区留言。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ZeroMQ的C语言实现是通过使用C语言库czmq来实现队列功能的。czmq是ZeroMQ的一个高级封装库,它提供了一组易于使用的API,用于在生产者和消费者之间建立队列通信。 使用ZeroMQ的C语言实现队列的主要特点是,不需要搭建队列环境,只需引入czmq库,并在生产者和消费者代码中调用相应的API即可。与传统的BSD开发不同,ZeroMQ中的Server和Client启动顺序没有要求。这意味着先启动Server还是先启动Client并不影响队列的正常运行。 总结起来,通过引入czmq库,并调用相应的API,ZeroMQ的C语言实现提供了一种简单而灵活的方法来实现队列功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [消息队列zeromq的c语言安装包czmq-4.2.1版本](https://download.csdn.net/download/weixin_41803458/85046594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [转载 消息队列ZeroMQ C语言](https://blog.csdn.net/wc996789331/article/details/104404412)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值