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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值