#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