该队列中需要用到的函数和结构体声明:
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
// 定义队列中的元素类型
typedef int Datatype;
// 定义队列结构体
typedef struct Queue {
Datatype* elements; // 指向队列元素的指针
//数组下标
int front; // 队列头部索引
int rear; // 队列尾部索引
//万金油参数
int maxSize; // 队列的容量
int curSize; // 队列中元素的数量
} Queue;
// 初始化队列
Queue* createQueue(int maxSize);
// 判断队列是否为空
bool isEmpty(Queue* queue);
// 判断队列是否已满
bool isFull(Queue* queue);
// 入队操作
void enqueue(Queue* queue, Datatype element);
// 出队操作
void dequeue(Queue* queue);
// 获取队列的前端元素
Datatype peek(Queue* queue);
// 销毁队列
void destroyQueue(Queue* queue);
函数实现:
Queue* createQueue(int maxSize)
{
//创建队列内存
Queue* newQueue = (Queue*)malloc(sizeof(Queue));
assert(newQueue);
//创建数据内存(注意该内存没有初始化)
newQueue->elements = (Datatype*)malloc(maxSize * sizeof(Datatype));
//初始化其余参数
newQueue->front = 0;
newQueue->rear = 0;
newQueue->curSize = 0;
newQueue->maxSize = maxSize;
return newQueue;
}
bool isEmpty(Queue* queue)
{
assert(queue);
if (queue->curSize == 0)
{
return true;
}
else
{
return false;
}
}
bool isFull(Queue* queue)
{
assert(queue);
if (queue->curSize == queue->maxSize)
{
return true;
}
else
{
return false;
}
}
//数据尾插
void enqueue(Queue* queue, Datatype element)
{
if (isFull(queue))
{
printf("队满\n");
return;
}
//如果没满,则向后放,然后++运算
queue->elements[queue->rear] = element;
queue->rear++;
queue->curSize++;
}
//数据头删
void dequeue(Queue* queue)
{
assert(queue);
if (isEmpty(queue))
{
printf("队空\n");
return;
}
//只需要对front进行++运算即可
queue->front++;
queue->curSize--;
}
Datatype peek(Queue* queue)
{
assert(queue);
return queue->elements[queue->front];
}
void destroyQueue(Queue* queue)
{
free(queue->elements);
free(queue);
}
说明:该队列不是循环队列,有数组溢出的风险。下面是循环队列的介绍:
循环队列:在循环队列中,当rear
到达数组末尾时,它应该回到数组的起始位置。同样,front
也应该在到达数组末尾时循环回起始位置。为了实现循环队列,需要在enqueue
和dequeue
函数中处理rear
和front
的循环逻辑。