c数据结构 -- 队列

185 阅读3分钟

队列

本文使用c语言完成队列这种数据结构的编码,关于队列数据结构的基本概念和术语可以参考之前的文章:[juejin.cn/post/727522… -- 队列)

1. 队列中的方法

  • initQueue(Queue *queue) 方法用于初始化队列。它将队列的前端指针 front 和后端指针 rear 都设置为-1,表示队列为空。
// 初始化队列  
void initQueue(Queue *queue) {  
    queue->front = -1;  
    queue->rear = -1;  
}  
  • isEmpty(Queue *queue) 方法用于判断队列是否为空。如果队列的前端指针 front 和后端指针 rear 都等于-1,则表示队列为空,返回1;否则返回0。
// 判断队列是否为空  
int isEmpty(Queue *queue) {  
    return (queue->front == -1 && queue->rear == -1);  
}  
  • isFull(Queue *queue) 方法用于判断队列是否已满。通过计算 (queue->rear + 1) % MAX_SIZE 来确定下一个位置是否和前端指针 front 相同。如果相同,则表示队列已满,返回1;否则返回0。
// 判断队列是否已满  
int isFull(Queue *queue) {  
    return (queue->rear + 1) % MAX_SIZE == queue->front;  
}  
  • enqueue(Queue *queue, int item) 方法用于将元素入队。首先判断队列是否已满,如果已满则无法入队,直接返回。然后根据当前的后端指针 rear 的位置将元素放入队列中,并更新 rear 的值。
void enqueue(Queue *queue, int item) {  
    if (isFull(queue)) {  
        printf("Queue is full. Cannot enqueue.\n");  
        return;  
    }  
      
    if (isEmpty(queue)) {  
        queue->front = 0;  
        queue->rear = 0;  
    } else {  
        queue->rear = (queue->rear + 1) % MAX_SIZE;  
    }  
      
    queue->data[queue->rear] = item;  
}  
  • dequeue(Queue *queue)方法用于将队首元素出队。首先判断队列是否为空,如果为空则无法出队,直接返回。然后根据当前的前端指针 front 的位置将元素从队列中取出,并更新 front 的值。
int dequeue(Queue *queue) {  
    if (isEmpty(queue)) {  
        printf("Queue is empty. Cannot dequeue.\n");  
        return -1;  
    }  
      
    int item = queue->data[queue->front];  
      
    if (queue->front == queue->rear) {  
        // 队列中只有一个元素  
        queue->front = -1;  
        queue->rear = -1;  
    } else {  
        queue->front = (queue->front + 1) % MAX_SIZE;  
    }  
      
    return item;  
}  
  • int front(Queue *queue)方法用于获取队列首元素,基本上与dequeue方法相同,但是队首元素不出队列,只返回其值,前端指针也不用移动位置。
int front(Queue *queue) {  
    if (isEmpty(queue)) {  
        printf("Queue is empty. No front element.\n");  
        return -1;  
    }  
      
    return queue->data[queue->front];  
}  

2. 实现代码

#include <stdio.h>  
#include <stdlib.h>  
  
#define MAX_SIZE 100  
  
typedef struct {  
    int data[MAX_SIZE];  
    int front;  
    int rear;  
} Queue;  
  
// 初始化队列  
void initQueue(Queue *queue) {  
    queue->front = -1;  
    queue->rear = -1;  
}  
  
// 判断队列是否为空  
int isEmpty(Queue *queue) {  
    return (queue->front == -1 && queue->rear == -1);  
}  
  
// 判断队列是否已满  
int isFull(Queue *queue) {  
    return (queue->rear + 1) % MAX_SIZE == queue->front;  
}  
  
// 入队操作  
void enqueue(Queue *queue, int item) {  
    if (isFull(queue)) {  
        printf("Queue is full. Cannot enqueue.\n");  
        return;  
    }  
      
    if (isEmpty(queue)) {  
        queue->front = 0;  
        queue->rear = 0;  
    } else {  
        queue->rear = (queue->rear + 1) % MAX_SIZE;  
    }  
      
    queue->data[queue->rear] = item;  
}  
  
// 出队操作  
int dequeue(Queue *queue) {  
    if (isEmpty(queue)) {  
        printf("Queue is empty. Cannot dequeue.\n");  
        return -1;  
    }  
      
    int item = queue->data[queue->front];  
      
    if (queue->front == queue->rear) {  
        // 队列中只有一个元素  
        queue->front = -1;  
        queue->rear = -1;  
    } else {  
        queue->front = (queue->front + 1) % MAX_SIZE;  
    }  
      
    return item;  
}  
  
// 获取队头元素  
int front(Queue *queue) {  
    if (isEmpty(queue)) {  
        printf("Queue is empty. No front element.\n");  
        return -1;  
    }  
      
    return queue->data[queue->front];  
}  
  
// 测试队列数据结构  
int main() {  
    Queue queue;  
    initQueue(&queue);  
      
    enqueue(&queue, 10);  
    enqueue(&queue, 20);  
    enqueue(&queue, 30);  
      
    printf("Front: %d\n", front(&queue)); // 10  
      
    int item = dequeue(&queue);  
    printf("Dequeued item: %d\n", item); // 10  
      
    printf("Front: %d\n", front(&queue)); // 20  
      
    return 0;  
}