日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下c语言队列,C语言队列的实现

發布時間:2023/12/31 linux 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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];

}

總結

以上是生活随笔為你收集整理的linux下c语言队列,C语言队列的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。