我的这个实现是基于双向链表的
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 我的设计理念就是让队列基于双向链表实现
// 节点类
typedef struct Node {
// 数据域
int data;
// 指针域
struct Node* pre;
struct Node* next;
}Node;
// 初始化队列
Node* initQueue() {
Node* queue = (Node*)malloc(sizeof(Node));
queue->data = 0;
queue->pre = NULL;
queue->next = NULL;
return queue;
}
// 入队函数 队尾入队
void enQueue(int data, Node* queue) {
// 为入队元素分配内存
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
// 获取队尾元素
Node* tail = queue;
while (tail->next) {
tail = tail->next;
}
Node* next = tail->next;
tail->next = node;
node->pre = tail;
node->next = next;
// 更新队列长度
queue->data++;
}
// 出队函数 队头出队
int deQueue(Node* queue) {
// 如果队列为空的话 那么就无法执行出队操作
if (queue->data == 0)return -1;
Node* pre = queue;
Node* node = pre->next;
int delete = node->data;
Node* next = node->next;
pre->next = next;
if(next)
next->pre = pre;
free(node);
queue->data--;
return delete;
}
// 对队列进行判空操作
bool isEmpty(Node* queue) {
return queue->data == 0;
}
// 对队列进行清空操作
void clear(Node* queue) {
Node* cur = queue->next;
Node* next;
while (cur) {
next = cur->next;
free(cur);
cur = next;
}
queue->data = 0;
}
// 获取队头元素
int get(Node* queue) {
if (queue->data == 0)return -1;
return queue->next->data;
}
// 获取队列长度
int size(Node* queue) {
return queue->data;
}
// 打印队列
void printQueue(Node* queue) {
Node* cur = queue->next;
while (cur) {
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
// 定义一个主函数
int main() {
Node* queue = initQueue();
enQueue(1, queue);// 1
enQueue(2, queue);// 1 2
enQueue(3, queue);// 1 2 3
enQueue(4, queue);// 1 2 3 4
printQueue(queue);// 1 2 3 4
deQueue(queue);// 2 3 4
printQueue(queue);// 2 3 4
printf("%d\n", get(queue));// 2
printf("%d\n", isEmpty(queue));// 0
printf("%d\n", size(queue));// 3
clear(queue);
printf("%d\n", size(queue));// 0
return 0;
}
测试可以顺利通过