This commit is contained in:
JiXieShi
2024-06-21 13:25:07 +08:00
parent ef79633f1a
commit 9d4fd5a082
2 changed files with 254 additions and 0 deletions

118
lib/inc/list/queue.h Normal file
View File

@@ -0,0 +1,118 @@
#ifndef HW_LIB_QUEUE_H
#define HW_LIB_QUEUE_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief 双向链表节点结构体
*/
typedef struct DoublyListNode {
void *val; // 节点值
struct DoublyListNode *next; // 后继节点
struct DoublyListNode *prev; // 前驱节点
} DoublyListNode;
/**
* @brief 双端队列结构体
*/
typedef struct {
DoublyListNode *front, *rear; // 头节点 front ,尾节点 rear
int queSize; // 双向队列的长度
} LinkedListDeque;
/**
* @brief 创建一个新的双端队列
* @return LinkedListDeque* 返回新创建的双端队列指针
* @example deque = newLinkedListDeque();
*/
extern LinkedListDeque *newLinkedListDeque();
/**
* @brief 销毁双端队列
* @param deque: [输入] 双端队列指针
* @return void
* @example delLinkedListdeque(deque);
*/
extern void delLinkedListdeque(LinkedListDeque *deque);
/**
* @brief 获取队列大小
* @param deque: [输入] 双端队列指针
* @return int 返回队列中元素个数
* @example size = queue_size(deque);
*/
extern int queue_size(LinkedListDeque *deque);
/**
* @brief 检查队列是否为空
* @param deque: [输入] 双端队列指针
* @return bool 若队列为空返回true否则返回false
* @example if (queue_is_empty(deque)) { // do something }
*/
extern bool queue_is_empty(LinkedListDeque *deque);
/**
* @brief 在队列头部插入元素
* @param deque: [输入] 双端队列指针
* @param data: [输入] 待插入的数据指针
* @return void
* @example pushFirst(deque, newData);
*/
extern void pushFirst(LinkedListDeque *deque, void *data);
/**
* @brief 在队列尾部插入元素
* @param deque: [输入] 双端队列指针
* @param data: [输入] 待插入的数据指针
* @return void
* @example pushLast(deque, newData);
*/
extern void pushLast(LinkedListDeque *deque, void *data);
/**
* @brief 获取队列头部元素但不移除
* @param deque: [输入] 双端队列指针
* @return void* 返回队列头部元素的指针若队列为空返回NULL
* @example firstData = peekFirst(deque);
*/
extern void *peekFirst(LinkedListDeque *deque);
/**
* @brief 获取队列尾部元素但不移除
* @param deque: [输入] 双端队列指针
* @return void* 返回队列尾部元素的指针若队列为空返回NULL
* @example lastData = peekLast(deque);
*/
extern void *peekLast(LinkedListDeque *deque);
/**
* @brief 弹出队列头部或尾部元素
* @param deque: [输入] 双端队列指针
* @param isFront: [输入] 若为true则从头部弹出否则从尾部弹出
* @return void* 返回被弹出元素的指针若队列为空返回NULL
* @example poppedData = pop(deque, true);
*/
extern void *pop(LinkedListDeque *deque, bool isFront);
/**
* @brief 弹出队列头部元素
* @param deque: [输入] 双端队列指针
* @return void* 返回被弹出的头部元素的指针若队列为空返回NULL
* @example poppedData = popFirst(deque);
*/
extern void *popFirst(LinkedListDeque *deque);
/**
* @brief 弹出队列尾部元素
* @param deque: [输入] 双端队列指针
* @return void* 返回被弹出的尾部元素的指针若队列为空返回NULL
* @example poppedData = popLast(deque);
*/
extern void *popLast(LinkedListDeque *deque);
#ifdef __cplusplus
}
#endif
#endif //HW_LIB_QUEUE_H