MST

星途 面试题库

面试题:C语言实现循环队列

请使用C语言实现一个循环队列。要求提供队列的初始化、入队、出队、判断队列是否为空以及判断队列是否已满的函数,并简要说明循环队列相较于普通队列的优势。
41.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>

// 定义循环队列结构体
typedef struct CircularQueue {
    int *data;
    int front;
    int rear;
    int capacity;
} CircularQueue;

// 初始化循环队列
CircularQueue* circularQueueCreate(int k) {
    CircularQueue *cq = (CircularQueue*)malloc(sizeof(CircularQueue));
    cq->data = (int*)malloc(k * sizeof(int));
    cq->front = 0;
    cq->rear = 0;
    cq->capacity = k;
    return cq;
}

// 判断循环队列是否已满
int circularQueueIsFull(CircularQueue* obj) {
    return (obj->rear + 1) % obj->capacity == obj->front;
}

// 判断循环队列是否为空
int circularQueueIsEmpty(CircularQueue* obj) {
    return obj->front == obj->rear;
}

// 入队操作
int circularQueueEnQueue(CircularQueue* obj, int value) {
    if (circularQueueIsFull(obj)) {
        return 0;
    }
    obj->data[obj->rear] = value;
    obj->rear = (obj->rear + 1) % obj->capacity;
    return 1;
}

// 出队操作
int circularQueueDeQueue(CircularQueue* obj) {
    if (circularQueueIsEmpty(obj)) {
        return 0;
    }
    obj->front = (obj->front + 1) % obj->capacity;
    return 1;
}

// 获取队首元素
int circularQueueFront(CircularQueue* obj) {
    if (circularQueueIsEmpty(obj)) {
        return -1;
    }
    return obj->data[obj->front];
}

// 获取队尾元素
int circularQueueRear(CircularQueue* obj) {
    if (circularQueueIsEmpty(obj)) {
        return -1;
    }
    return obj->data[(obj->rear - 1 + obj->capacity) % obj->capacity];
}

// 释放循环队列内存
void circularQueueFree(CircularQueue* obj) {
    free(obj->data);
    free(obj);
}

循环队列相较于普通队列的优势:

  1. 空间利用率更高:普通队列在元素出队后,前面的空间无法再次利用,可能导致空间浪费。而循环队列可以重复利用这些空间,当队尾指针到达数组末尾时,可以回到数组开头继续使用空间,只要数组还有空闲位置就可以继续入队。
  2. 避免假溢出:普通队列可能会出现假溢出的情况,即队尾指针已经到数组末尾,但数组前面还有空闲位置,却无法再进行入队操作。循环队列通过循环利用数组空间,有效避免了这种假溢出问题。