如果要求入队 (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) 时间复杂度内完成。

循环双链表实现队列:O(1) 时间复杂度的入队和出队操作

原文地址: https://www.cveoy.top/t/topic/Vu4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录