程序内有详细备注
结构特点:对头删除队尾插入,先进先出。
利用头尾的标识来决定、头删尾插,头尾标识的运用。
初始化队列 |
void initQueue(Queue *queue, size_t capacity) |
返回队列内元素个数 |
size_t getSize(const Queue *queue) |
添加新元素 |
void enqueue(Queue *queue, int element) |
元素出队列 |
int dequeue(Queue *queue) |
释放队列内存 |
void destroyQueue(Queue *queue) |
遍历队列 |
void printQueue(Queue *queue) |
#include <stdio.h>
#include <stdlib.h>
// 队列结构
typedef struct
{
int *data; // 动态数组存储队列元素
size_t size; // 队列内元素个数
size_t capacity; // 动态数组的容量
size_t front; // 队列头指针
size_t rear; // 队列尾指针
} Queue;
// 初始化队列
void initQueue(Queue *queue, size_t capacity)
{
queue->data = (int *)malloc(capacity * sizeof(int)); // 分配初始容量的内存
queue->size = 0; // 初始元素个数为0
queue->capacity = capacity; // 设置容量
queue->front = 0; // 队列头指针
queue->rear = 0; // 队列尾指针
}
// 返回队列内元素个数
size_t getSize(const Queue *queue)
{
return queue->size;
}
// 添加新元素
void enqueue(Queue *queue, int element)
{
if (queue->size == queue->capacity)
{
printf("队列已满,添加失败\n");
return;
}
queue->data[queue->rear] = element; // 将元素添加到队列尾部
queue->rear = (queue->rear + 1) % queue->capacity; // 模n同1,循环更新队列尾指针
queue->size++; // 更新元素个数
}
// 元素出队列
int dequeue(Queue *queue)
{
if (queue->size == 0)
{
return -1; // 队列为空,返回无效值
}
int dequeuedElement = queue->data[queue->front]; // 获取队列头部元素
queue->front = (queue->front + 1) % queue->capacity; // 模n同1,头队列在运行到尾队列前时归0
queue->size--; // 更新元素格数
return dequeuedElement; // 返回出队的元素
}
// 释放队列内存
void destroyQueue(Queue *queue)
{
free(queue->data); // 释放动态数组内存
queue->data = NULL;
queue->capacity = 0;
queue->size = 0;
queue->rear = 0;
queue->front = 0;
}
// 遍历队列
void printQueue(Queue *queue)
{
for (int i = queue->front, j = 0; j < queue->size; i++, j++)
{
int data = queue->data[i % queue->capacity];//循环队列,从头开始j保证遍历个数
printf("%d ", data);
}
printf("\n");
}
int main()
{
Queue myQueue;
// 初始化队列
initQueue(&myQueue, 2);
printf("初始化队列,初始容量为2\n");
// 入队元素
enqueue(&myQueue, 1);
enqueue(&myQueue, 2);
// 遍历
printQueue(&myQueue);
printf("队列内元素个数:%zu\n", getSize(&myQueue));
// 出队元素
printf("出队元素:%d\n", dequeue(&myQueue));
// 遍历
printQueue(&myQueue);
printf("队列内元素个数:%zu\n", getSize(&myQueue));
// 释放队列内存
destroyQueue(&myQueue);
printf("队列内存已释放\n");
// 遍历
printQueue(&myQueue);
printf("队列内元素个数:%zu\n", getSize(&myQueue));
return 0;
}