我是靠谱客的博主 谨慎小丸子,最近开发中收集的这篇文章主要介绍linux下c语言队列,C语言队列的实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在C++ 里,队列可以直接使用 std::queue

队列的C语言实现如下:

queue.c

/**

* @brief 队列,顺序存储,循环队列.

*/

#include   /* for malloc(), free() */

#include   /* for memcpy() */

#ifndef __cplusplus

typedef char bool;

#define false 0

#define true 1

#endif

typedef int queue_elem_t; // 元素的类型

/*

*@struct

*@brief 队列的结构体定义.

*@note 无

*/

typedef struct queue_t {

int front;/* 队头 */

int rear;/* 队尾 */

int capacity; /* 容量大小,以元素为单位 */

queue_elem_t *elems; /* 存放数据的内存块 */

}queue_t;

/**

* @brief 初始化队列.

* @param[out] q 队列结构体的指针

* @param[in] capacity 初始容量

* @return 无

*/

void queue_init(queue_t *q, const int capacity) {

q->front = 0;

q->rear = 0;

q->capacity = capacity;

q->elems = (queue_elem_t*)malloc(capacity * sizeof(queue_elem_t));

}

/**

* @brief 释放队列.

* @param[inout] q 队列对象的指针

* @return 无

*/

void queue_uninit(queue_t *q) {

q->front = 0;

q->rear = 0;

q->capacity = 0;

free(q->elems);

q->elems = NULL;

}

/**

* @brief 判断队列是否为空.

* @param[in] q 队列结构体的指针

* @return 是空,返回 TRUE,否则返回 FALSE

*/

bool queue_empty(const queue_t *q) {

return q->front == q->rear;

}

/**

* @brief 获取元素个数.

* @param[in] s 栈对象的指针

* @return 元素个数

*/

int queue_size(const queue_t *q) {

return (q->rear - q->front + q->capacity) % q->capacity;

}

/**

* @brief 在队尾添加元素.

* @param[in] q 指向队列结构体的指针

* @param[in] x 要添加的元素

* @return 无

*/

void queue_push(queue_t *q, const queue_elem_t x) {

if( (q->rear+1) % q->capacity == q->front)

{

// 已满,重新分配内存

queue_elem_t* tmp = (queue_elem_t*)malloc(q->capacity * 2 * sizeof(queue_elem_t));

if(q->front < q->rear)

{

memcpy(tmp, q->elems + q->front, (q->rear - q->front) * sizeof(queue_elem_t));

q->rear -= q->front;

q->front = 0;

}

else if(q->front > q->rear)

{

/* 拷贝 q->front 到 q->capacity 之间的数据 */

memcpy(tmp, q->elems + q->front, (q->capacity - q->front) * sizeof(queue_elem_t));

/* 拷贝 q->data[0] 到 q->data[rear] 之间的数据 */

memcpy(tmp + (q->capacity - q->front), q->elems, q->rear * sizeof(queue_elem_t));

q->rear += q->capacity - q->front;

q->front = 0;

}

free(q->elems);

q->elems = tmp;

q->capacity *= 2;

}

q->elems[q->rear] = x;

q->rear = (q->rear + 1) % q->capacity;

}

/**

* @brief 在队头删除元素.

* @param[in] q 队列结构体的指针

* @param[out] x 存放退出队列的元素

* @return 无

*/

void queue_pop(queue_t *q) {

q->front = (q->front + 1) % q->capacity;

}

/**

* @brief 获取队首元素.

* @param[in] q 队列对象的指针

* @return 队首元素

*/

queue_elem_t queue_front(const queue_t *q) {

return q->elems[q->front];

}

/**

* @brief 获取队首元素.

* @param[in] q 队列对象的指针

* @return 队首元素

*/

queue_elem_t queue_back(const queue_t *q) {

return q->elems[q->rear - 1];

}

0b1331709591d260c1c78e86d0c51c18.png

最后

以上就是谨慎小丸子为你收集整理的linux下c语言队列,C语言队列的实现的全部内容,希望文章能够帮你解决linux下c语言队列,C语言队列的实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部