C实现循环队列

发布时间 2023-11-13 17:38:57作者: Guanjie255

1.循环队列的基本模型

1.1 此模型采用的队列判空条件是rear == front为真

1.2 此模型采用的队列已满条件是(rear+1)%maxsize == front为真,因此有一个数组单元(也就是front指向的数组单元)不可使用

1.3 可以在队列结点加一个成员表示最近一次对队列的操作为入队操作或者出队操作,这样就就可以利用数组的全部单元

1.3.1 这种情况下,队列为空的条件:rear == front为真 && 最近一次对队列的操作是出队操作

1.3.1 这种情况下,队列已满的条件:rear == front为真 && 最近一次对队列的操作是入队操作

1.4 本文采用第一种方案(浪费一个数组单元)

2.循环队列的结点结构

typedef struct QueueNode {
	int* data;  /*使用数组存放队列元素*/
	int front, rear;  /*队头指针,队尾指针*/
	int maxsize;  /*队列的最大元素个数*/
} QueueNode, *Queue;

3.创建并初始化一个循环队列,参数maxsize表示队列最大元素个数

Queue createQueue(int maxsize) {
	/*初始化一个循环队列*/
	Queue queue = (Queue)malloc(sizeof(QueueNode));
	queue->data = (int*)malloc(sizeof(int) * maxsize);
	queue->front = 0;
	queue->rear = 0;
	queue->maxsize = maxsize;
	return queue;
}

4.判断循环队列是否为空

bool isEmpty(Queue queue) {
	/*判断队列是否为空*/
	return queue->rear == queue->front;
}

5.判断循环队列是否已满

bool isFull(Queue queue) {
	/*判断队列是否已满*/
	return (queue->rear + 1) % queue->maxsize == queue->front;
}

6.元素在队尾入队:首先rear = (rear+1)%maxsize,然后再赋值

bool enqueue(Queue queue, int element) {
	/*在队列的尾部入队,需要判断队列是否已满*/
	if (isFull(queue)) {
		printf("queue is full!!\n");
		return false;
	} else {
		queue->rear = (queue->rear + 1) % queue->maxsize;
		(queue->data)[queue->rear] = element;
		return true;
	}
}

7.队头元素出队:首先front = (front+1)%maxsize,然后再出队

int dequeue(Queue queue) {
	/*队头元素出队,需要判断队列是否为空*/
	if (isEmpty(queue))	{
		printf("queue is empty!!!\n");
		return 99999;
	} else {
		queue->front = (queue->front + 1) % queue->maxsize;
		return (queue->data)[queue->front];
	}
}

8.销毁队列

void destroy(Queue queue) {
	/*销毁队列*/
	free(queue->data);
	queue->data = NULL;
	free(queue);
	queue = NULL;
}

9.完整代码

点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct QueueNode {
	int* data;  /*使用数组存放队列元素*/
	int front, rear;  /*队头指针,队尾指针*/
	int maxsize;  /*队列的最大元素个数*/
} QueueNode, *Queue;

Queue createQueue(int maxsize);
bool isEmpty(Queue queue);
bool isFull(Queue queue);
bool enqueue(Queue queue, int element);
int dequeue(Queue queue);
void destroy(Queue queue); 

int main(int argc, char* argv[]) {
	/*创建循环队列*/
	int maxsize;
	printf("Please input maxsize: ");
	scanf("%d", &maxsize);
	Queue queue = createQueue(maxsize);

	/*执行入队出队操作*/
	enqueue(queue, 10);
	enqueue(queue, 20);
	printf("%d\n", dequeue(queue));
	enqueue(queue, 5);
	printf("%d\n", dequeue(queue));

	/*销毁队列*/
	destroy(queue);
	queue = NULL;

	return 0; 
}

Queue createQueue(int maxsize) {
	/*初始化一个循环队列*/
	Queue queue = (Queue)malloc(sizeof(QueueNode));
	queue->data = (int*)malloc(sizeof(int) * maxsize);
	queue->front = 0;
	queue->rear = 0;
	queue->maxsize = maxsize;
	return queue;
}

bool isEmpty(Queue queue) {
	/*判断队列是否为空*/
	return queue->rear == queue->front;
}

bool isFull(Queue queue) {
	/*判断队列是否已满*/
	return (queue->rear + 1) % queue->maxsize == queue->front;
}

bool enqueue(Queue queue, int element) {
	/*在队列的尾部入队,需要判断队列是否已满*/
	if (isFull(queue)) {
		printf("queue is full!!\n");
		return false;
	} else {
		queue->rear = (queue->rear + 1) % queue->maxsize;
		(queue->data)[queue->rear] = element;
		return true;
	}
}

int dequeue(Queue queue) {
	/*对头元素出队,需要判断队列是否为空*/
	if (isEmpty(queue))	{
		printf("queue is empty!!!\n");
		return 99999;
	} else {
		queue->front = (queue->front + 1) % queue->maxsize;
		return (queue->data)[queue->front];
	}
}

void destroy(Queue queue) {
	/*销毁队列*/
	free(queue->data);
	queue->data = NULL;
	free(queue);
	queue = NULL;
}

10.点击pythontutor进入线上运行环境