循环双链表实现队列:O(1) 时间复杂度的入队和出队操作
如果要求入队 (EnQueue) 和出队 (DeQueue) 操作的时间复杂度都为 O(1),可以使用循环双链表来实现队列。
以下是使用循环双链表实现队列操作的 EnQueue 和 DeQueue 过程的示例代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
typedef struct Queue {
Node* front;
Node* rear;
} Queue;
// 初始化队列
void initQueue(Queue* q) {
q->front = NULL;
q->rear = NULL;
}
// 入队操作
void enQueue(Queue* q, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
if (q->rear == NULL) {
// 队列为空,新节点既是队首也是队尾
newNode->prev = newNode;
newNode->next = newNode;
q->front = newNode;
} else {
// 将新节点插入到队尾,并更新队尾指针
newNode->prev = q->rear;
newNode->next = q->front;
q->rear->next = newNode;
q->front->prev = newNode;
}
q->rear = newNode;
}
// 出队操作
int deQueue(Queue* q) {
if (q->front == NULL) {
// 队列为空,无法出队
printf("Queue is empty.
");
return -1;
}
int value = q->front->data;
Node* temp = q->front;
if (q->front == q->rear) {
// 队列只有一个节点,出队后队列为空
q->front = NULL;
q->rear = NULL;
} else {
// 更新队首指针,并重新连接队首和队尾节点
q->front = q->front->next;
q->front->prev = q->rear;
q->rear->next = q->front;
}
free(temp);
return value;
}
int main() {
Queue q;
initQueue(&q);
enQueue(&q, 10);
enQueue(&q, 20);
enQueue(&q, 30);
printf("Dequeued item: %d\n", deQueue(&q));
printf("Dequeued item: %d\n", deQueue(&q));
printf("Dequeued item: %d\n", deQueue(&q));
return 0;
}
在上述代码中,我们使用循环双链表来实现队列操作。Queue 结构体包含了指向队首和队尾的指针。initQueue() 函数用于初始化队列,enQueue() 函数用于入队操作,deQueue() 函数用于出队操作。在 enQueue() 函数中,我们插入新节点到队尾,并更新队尾指针。在 deQueue() 函数中,我们返回队首节点的元素值,并更新队首指针,重新连接队首和队尾节点。
使用循环双链表实现的队列,无论是入队还是出队操作,都可以在 O(1) 时间复杂度内完成。
原文地址: https://www.cveoy.top/t/topic/Vu4 著作权归作者所有。请勿转载和采集!