112 lines
3.2 KiB
C
112 lines
3.2 KiB
C
#pragma once
|
||
#ifndef HW_LIB_QUEUE_H
|
||
#define HW_LIB_QUEUE_H
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/**
|
||
* @brief 双向链表节点结构体
|
||
*/
|
||
typedef struct Queue_Node_t {
|
||
void *val; // 节点值
|
||
struct Queue_Node_t *next; // 后继节点
|
||
struct Queue_Node_t *prev; // 前驱节点
|
||
} Queue_Node_t;
|
||
|
||
/**
|
||
* @brief 双端队列结构体
|
||
*/
|
||
typedef struct {
|
||
Queue_Node_t *front, *rear; // 头节点 front ,尾节点 rear
|
||
int queSize; // 双向队列的长度
|
||
size_t typeSize; // 元素类型的大小
|
||
} Queue_List_t;
|
||
|
||
/**
|
||
* @brief 创建一个新的双端队列
|
||
* @param typeSize: [输入] 元素类型的大小
|
||
* @return Queue_List_t* 返回新创建的双端队列指针
|
||
* @example deque = newQueue_List(sizeof(int));
|
||
*/
|
||
extern Queue_List_t *newQueue_List(unsigned char size);
|
||
|
||
/**
|
||
* @brief 销毁双端队列
|
||
* @param deque: [输入] 双端队列指针
|
||
* @return void
|
||
* @example delQueue_List(deque);
|
||
*/
|
||
extern void delQueue_List(Queue_List_t *deque);
|
||
|
||
/**
|
||
* @brief 获取队列大小
|
||
* @param deque: [输入] 双端队列指针
|
||
* @return int 返回队列中元素个数
|
||
* @example size = queue_size(deque);
|
||
*/
|
||
extern int queue_size(Queue_List_t *deque);
|
||
|
||
/**
|
||
* @brief 检查队列是否为空
|
||
* @param deque: [输入] 双端队列指针
|
||
* @return bool 若队列为空返回true,否则返回false
|
||
* @example if (queue_is_empty(deque)) { // do something }
|
||
*/
|
||
extern bool queue_is_empty(Queue_List_t *deque);
|
||
|
||
/**
|
||
* @brief 在队列头部插入元素
|
||
* @param deque: [输入] 双端队列指针
|
||
* @param data: [输入] 待插入的数据指针
|
||
* @return void
|
||
* @example pushFirst(deque, newData);
|
||
*/
|
||
extern void pushFirst(Queue_List_t *deque, void *data);
|
||
|
||
/**
|
||
* @brief 在队列尾部插入元素
|
||
* @param deque: [输入] 双端队列指针
|
||
* @param data: [输入] 待插入的数据指针
|
||
* @return void
|
||
* @example pushLast(deque, newData);
|
||
*/
|
||
extern void pushLast(Queue_List_t *deque, void *data);
|
||
|
||
/**
|
||
* @brief 获取队列头部元素但不移除
|
||
* @param deque: [输入] 双端队列指针
|
||
* @return void* 返回队列头部元素的指针,若队列为空返回NULL
|
||
* @example firstData = peekFirst(deque);
|
||
*/
|
||
extern void *peekFirst(Queue_List_t *deque);
|
||
|
||
/**
|
||
* @brief 获取队列尾部元素但不移除
|
||
* @param deque: [输入] 双端队列指针
|
||
* @return void* 返回队列尾部元素的指针,若队列为空返回NULL
|
||
* @example lastData = peekLast(deque);
|
||
*/
|
||
extern void *peekLast(Queue_List_t *deque);
|
||
/**
|
||
* @brief 弹出队列头部元素
|
||
* @param deque: [输入] 双端队列指针
|
||
* @return void* 返回被弹出的头部元素的指针,若队列为空返回NULL
|
||
* @example poppedData = popFirst(deque);
|
||
*/
|
||
extern void *popFirst(Queue_List_t *deque);
|
||
|
||
/**
|
||
* @brief 弹出队列尾部元素
|
||
* @param deque: [输入] 双端队列指针
|
||
* @return void* 返回被弹出的尾部元素的指针,若队列为空返回NULL
|
||
* @example poppedData = popLast(deque);
|
||
*/
|
||
extern void *popLast(Queue_List_t *deque);
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
#endif //HW_LIB_QUEUE_H
|