队列的数组实现原码分享(C语言)

文章提供了一个使用C语言实现的基于数组的队列结构,包括创建队列、检查队列是否为空、是否已满、释放队列内存、清空队列、入队、出队、获取队头元素以及打印队列内容等操作。示例代码展示了如何使用这些函数进行入队、出队和打印队列状态。
摘要由CSDN通过智能技术生成

队列的数组的实现

1、头文件

(queue.h)

#pragma once
/*
* 队列的数组实现
*/

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

struct Queue* createQueue(int maxElements);

bool isEmpty(struct Queue* q);
bool isFull(struct Queue* q);

void disposeQueue(struct Queue* q);		//释放队列内存空间

void makeEmpty(struct Queue* q);

void enqueue(int x, struct Queue* q);	//入队
void dequeue(struct Queue* q);			//出队

int succ(int index, struct Queue* q);	//循环数组的角标计算

int front(struct Queue* q);
int frontAndDequeue(struct Queue* q);

void printQueue(struct Queue* q);

struct Queue
{
	int capacity;		//队列的容量
	int size;			//队列的有效数据的大小

	int front;			//队列的角标
	int rear;			//队尾的角标

	int* array;			//指针,指向数组首元素的地址(即数组地址)
};

2、主函数

(main.c)

#include "queue.h"

int main()
{
	int val;
	struct Queue* q;

	//创建队列
	q = createQueue(5);

	//入队
	enqueue(1, q);
	enqueue(2, q);
	enqueue(3, q);
	enqueue(4, q);
	enqueue(5, q);
	
	//打印队列
	printQueue(q);
	printf("\n-------------------\n");

	//出队
	dequeue(q);
	dequeue(q);
	printQueue(q);
	printf("\n-------------------\n");

	enqueue(9, q);
	printQueue(q);
	printf("\n-------------------\n");

	//获取表头的元素
	val = front(q);
	printf("val:%d", val);
	printf("\n-------------------\n");

	return 0;
}

3、函数的实现

3.1 createQueue.c

#include "queue.h"

struct Queue* createQueue(int maxElements)
{
	struct Queue* q = malloc(sizeof(struct Queue));
	if (NULL == q) {
		printf("内存空间不足,创建队列失败");
		return NULL;
	}
	q->array = malloc(sizeof(int) * maxElements);
	if (NULL == q->array) {
		printf("内存空间不足,创建队列失败");
		return NULL;
	}
	q->capacity = maxElements;
	makeEmpty(q);
	return q;
}

3.2 isEmpty.c

#include "queue.h"

bool isEmpty(struct Queue* q)
{
	return 0 == q->size;
}

3.3 isFull.c

#include "queue.h"

bool isFull(struct Queue* q)
{
	return q->size >= q->capacity;
}

3.4 disposeQueue.c

#include "queue.h"

void disposeQueue(struct Queue* q)
{
	if (q->array != NULL) {
		free(q->array);
	}
	if (q != NULL) {
		free(q);
	}
}

3.5 makeEmpty.c

#include "queue.h"

void makeEmpty(struct Queue* q)
{
	q->front = 1;
	q->rear = 0;
	q->size = 0;
}

3.6 enqueue.c

#include "queue.h"

void enqueue(int x, struct Queue* q)
{
	if (isFull(q)) {
		printf("队列的空间不足\n");
		return;
	}
	++q->size;
	q->rear = succ(q->rear, q);
	q->array[q->rear] = x;
}

3.7 dequeue.c

#include "queue.h"

void dequeue(struct Queue* q)
{
	if (isEmpty(q)) {
		printf("队列为空,无法出栈");
		return;
	}
	--q->size;
	q->front = succ(q->front, q);
}

3.8 succ.c

#include "queue.h"

int succ(int index, struct Queue* q)
{
	++index;
	return index % q->capacity;
}

3.9 front.c

#include "queue.h"

int front(struct Queue* q)
{
	if (isEmpty(q)) {
		printf("empty queue\n");
		return 0;
	}
	return q->array[q->front];
}

3.10 frontAndDequeue.c

#include "queue.h"

int frontAndDequeue(struct Queue* q)
{
	int element;
	if (isEmpty(q)) {
		printf("empty queue\n");
		return 0;
	}
	element = q->array[q->front];
	--q->size;
	q->front = succ(q->front, q);
	return element;
}

3.11 printQueue.c

#include "queue.h"

void printQueue(struct Queue* q)
{
	int front = q->front;
	int rear = q->rear;
	int size = q->size;
	int capacity = q->capacity;
	
	for (int i = front; i < front + size; i++) {
		printf("%d ", q->array[i % capacity]);
	}
}

4、写在最后

为方便大家学习,我已经将原码上传到了GitHub,欢迎大家下载。链接:link(文件名:队列的数组实现)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值