队列

队列

队列的定义

队列是只能在队头出队(dequeue),只能在队尾入队(enqueue)的表。

队列的实现

链表实现

链表队列的定义

typedef struct Node
{
	int m_Data;
	struct Node* m_Next;
}Node;
typedef struct Queue
{
	Node* m_Rear;	//队尾
	Node* m_Front;	//队首
	size_t m_Size;
}Queue;

判断队列是否为空

inline bool L_IsEmpty(const Queue* const queue)	//判断链表是否为空
{
	return queue->m_Front->m_Next == NULL;
}

创建队列

Queue* L_CreateQueue()	//创建队列
{
	Queue* queue = (Queue*)malloc(sizeof(Queue));
	if (!queue) {
		return NULL;
	}
	queue->m_Front = (Node*)malloc(sizeof(Node));
	if (!queue->m_Rear) {
		return NULL;
	}
	queue->m_Front->m_Next = NULL;
	queue->m_Rear = queue->m_Front;
	queue->m_Size = 0;
	return queue;
}

入队

void L_Enqueue(int data, Queue* queue)	//入队
{
	Node* tmp = (Node*)malloc(sizeof(Node));
	if (!tmp) {
		return;
	}
	tmp->m_Data = data;
	tmp->m_Next = queue->m_Rear->m_Next;
	queue->m_Rear->m_Next = tmp;
	queue->m_Rear = tmp;
	queue->m_Size++;
}

出队

void L_Dequeue(Queue* queue)	//出队
{
	assert(!L_IsEmpty(queue));
	Node* tmp = queue->m_Front->m_Next;
	queue->m_Front->m_Next = tmp->m_Next;
	free(tmp);
	tmp = NULL;
	queue->m_Size--;
}

返回队头

int L_Front(Queue* queue)	//返回队头
{
	assert(!L_IsEmpty(queue));
	return queue->m_Front->m_Next->m_Data;
}

返回队头并出队

int L_FrontAndDequeue(Queue* queue)	//返回队头并出队
{
	assert(!L_IsEmpty(queue));
	Node* tmp = queue->m_Front->m_Next;
	int data = tmp->m_Data;
	queue->m_Front->m_Next = tmp->m_Next;
	free(tmp);
	tmp = NULL;
	queue->m_Size--;
	return data;
}

清空队列

void L_MakeEmpty(Queue* queue)	//清空队列
{
	Node* position = queue->m_Front->m_Next;
	queue->m_Front->m_Next = NULL;
	while (position) {
		Node* tmp = position->m_Next;
		free(position);
		position = tmp;
	}
	queue->m_Rear = queue->m_Front;
	queue->m_Size = 0;
}

删除队列

Queue* L_DisposeQueue(Queue* queue)	//删除队列
{
	Node* position = queue->m_Front;
	queue->m_Rear = NULL;
	while (position) {
		Node* tmp = position->m_Next;
		free(position);
		position = tmp;
	}
	free(queue);
	queue = NULL;
	return queue;
}

数组实现

通过循环数组实现队列。

数组队列的定义

typedef struct QueueArray
{
	size_t m_Capacity;	//容量
	size_t m_Size;	//元素个数
	size_t m_Front;	//对头
	size_t m_Rear;	//队尾
	int* m_Array;	//数组
}QueueArray;

循环判定

//队尾和队头循环
inline size_t A_Circulation(size_t position, QueueArray* queue)
{
	if (++position == queue->m_Capacity) {
		position = 0;
	}
	return position;
}

判断是否为空

//判断队列是否为空
inline bool A_IsEmpty(QueueArray* const queue)
{
	return queue->m_Size == 0;
}

判断是否为满

//判断队列是否为满
inline bool A_IsFull(QueueArray* const queue)
{
	return queue->m_Size == queue->m_Capacity;
}

创建队列

//创建一个队列
QueueArray* A_CreateQueue(const size_t capacity)
{
	QueueArray* queue = (QueueArray*)malloc(sizeof(QueueArray));
	if (!queue) {
		return NULL;
	}
	queue->m_Array = (int*)malloc(sizeof(int) * capacity);
	if (!queue) {
		return NULL;
	}
	queue->m_Capacity = capacity;
	queue->m_Size = 0;
	queue->m_Front = 1;
	queue->m_Rear = 0;
	return queue;
}

入队

//入队
void A_Enqueue(int data, QueueArray* queue)
{
	assert(!A_IsFull(queue));
	queue->m_Rear = A_Circulation(queue->m_Rear, queue);
	queue->m_Array[queue->m_Rear] = data;
	queue->m_Size++;
}

出队

//出队
void A_Dequeue(QueueArray* queue)
{
	assert(!A_IsEmpty(queue));
	queue->m_Front = A_Circulation(queue->m_Front, queue);
	queue->m_Size--;
}

返回队头

//返回队头
int A_Front(QueueArray* queue)
{
	assert(!A_IsEmpty(queue));
	return queue->m_Array[queue->m_Front];
}

返回队头并出列

//返回对头并出队
int A_FrontAndDequeue(QueueArray* queue)
{
	assert(!A_IsEmpty(queue));
	int data = queue->m_Array[queue->m_Front];
	queue->m_Front = A_Circulation(queue->m_Front, queue);
	queue->m_Size--;
	return data;
}

清空队列

//清空队列
void A_MakeEmpty(QueueArray* queue)
{
	queue->m_Front = 1;
	queue->m_Rear = 0;
	queue->m_Size = 0;
}

删除队列

//删除队列
QueueArray* A_DisposeQueue(QueueArray* queue)
{
	free(queue->m_Array);
	free(queue);
	queue = NULL;
	return queue;
}
posted @ 2025-10-13 23:59  单身喵  阅读(6)  评论(0)    收藏  举报