该队列中需要用到的函数和结构体声明:
#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
的循环逻辑。