队列实现代码总结

今天,我带了队列的实现代码总结。





队列的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 。出队列:进行删除操作的一端称为队头



队列实现的三个文档

Queue.h--------头文件的引用和函数的声明
Queue.c--------函数的定义
test.c--------栈的代码实现的检验



初始化函数

//初始化函数
void InitQueue(Queue* ps)
{
	assert(ps);

	ps->Head = NULL;
	ps->Tail = NULL;
	ps->size = 0;
}


销毁函数

//销毁函数
void DestroyQueue(Queue* ps)
{
	assert(ps);

	QueueNode* cur = ps->Head;
	while (cur != NULL)
	{
		QueueNode* Next = cur->next;
		free(cur);
		cur = Next ;
	}
	ps->Head = ps->Tail = NULL;
	ps->size = 0;
}


入队列函数

//入队列
void QueuePush(Queue* ps, QDataType x)
{
	assert(ps);

	QueueNode* NewNode = (QueueNode*)malloc(sizeof(QueueNode));
	if (NewNode == NULL)
	{
		perror("QueuePush()");
		exit(1);
	}
	NewNode->val = x;
	NewNode->next = NULL;

	if (ps->Tail == NULL)
	{
		ps->Head = ps->Tail = NewNode;
	}
	else
	{
		ps->Tail->next = NewNode;
		ps->Tail = ps->Tail->next;
	}
	ps->size++;
}


出队列函数

//出队列
void QueuePop(Queue* ps)
{
	assert(ps);
	assert(!QueueEmpty(ps));
	
	if(ps->Head->next == NULL)
	{
		free(ps->Head);
		ps->Head = ps->Tail = NULL;
	}
	else
	{
		QueueNode* Next = ps->Head->next;
		free(ps->Head);
		ps->Head = Next;
	}
	ps->size--;
}


查看队头函数

//查看队头数据
QDataType QueueFront(Queue* ps)
{
	assert(ps);
	assert(!QueueEmpty(ps));

	return ps->Head->val;
}


查看队尾函数

//查看队尾数据
QDataType QueueBack(Queue* ps)
{
	assert(ps);

	assert(!QueueEmpty(ps));    

	return ps->Tail->val;
}


统计队列的数据个数

//统计队列的数据个数
int QueueSize(Queue* ps)
{
	assert(ps);

	return ps->size;
}


判断队列是否为空的函数

//判断队列是否为空
bool QueueEmpty(Queue* ps)
{
	assert(ps);
	
	return ps->size == 0;
}


头文件的声明和函数的定义

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

typedef int QDataType;
typedef struct QueueNode
{
	QDataType val;
	struct QueueNode* next;
}QueueNode;

typedef struct Queue
{
	QueueNode* Head;
	QueueNode* Tail;
	int size;
}Queue;

//初始化函数
void InitQueue(Queue* ps);

//销毁函数
void DestroyQueue(Queue* ps);

//入队列
void QueuePush(Queue* ps, QDataType x);

//出队列
void QueuePop(Queue* ps);

//查看队尾数据
QDataType QueueBack(Queue* ps);

//查看队头数据
QDataType QueueFront(Queue* ps);

//统计队列的数据个数
int QueueSize(Queue* ps);

//判断队列是否为空
bool QueueEmpty(Queue* ps);


菜单的实现和函数的调用

void menu()
{
	printf("*************************************************************\n");
	printf("***    1.入列                       2.出列                ***\n");
	printf("***    3.查看队头数据               4.查看队尾数据        ***\n");
	printf("***    5.统计队列数据个数           6.判断队列是否为空    ***\n");
	printf("***    0.退出                                             ***\n");
	printf("*************************************************************\n");
}
int main()
{
	int input = 0;
	int num = 0;
	Queue q;
	InitQueue(&q);
	do
	{
		menu();
		printf("请选择:>\n");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			printf("请输入你要入列的数据\n");
			scanf("%d",&num);
			QueuePush(&q,num);
			break;
		case 2:
			QueuePop(&q);
			break;
		case 3:
			printf("%d\n",QueueFront(&q));
			break;
		case 4:
			printf("%d\n", QueueBack(&q));
			break;
		case 5:
			printf("%d\n", QueueSize(&q));
			break;
		case 6:
			if (QueueEmpty(&q) != true)
			{
				printf("队列非空\n");
			}
			else
			{
				printf("队列为空\n");
			}
			break;
		case 0:
			DestroyQueue(&q);
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}


Queue.c文档的代码

#include "Queue.h"

//初始化函数
void InitQueue(Queue* ps)
{
	assert(ps);

	ps->Head = NULL;
	ps->Tail = NULL;
	ps->size = 0;
}

//销毁函数
void DestroyQueue(Queue* ps)
{
	assert(ps);

	QueueNode* cur = ps->Head;
	while (cur != NULL)
	{
		QueueNode* Next = cur->next;
		free(cur);
		cur = Next ;
	}
	ps->Head = ps->Tail = NULL;
	ps->size = 0;
}

//入队列
void QueuePush(Queue* ps, QDataType x)
{
	assert(ps);

	QueueNode* NewNode = (QueueNode*)malloc(sizeof(QueueNode));
	if (NewNode == NULL)
	{
		perror("QueuePush()");
		exit(1);
	}
	NewNode->val = x;
	NewNode->next = NULL;

	if (ps->Tail == NULL)
	{
		ps->Head = ps->Tail = NewNode;
	}
	else
	{
		ps->Tail->next = NewNode;
		ps->Tail = ps->Tail->next;
	}
	ps->size++;
}

//出队列
void QueuePop(Queue* ps)
{
	assert(ps);
	assert(!QueueEmpty(ps));
	
	if(ps->Head->next == NULL)
	{
		free(ps->Head);
		ps->Head = ps->Tail = NULL;
	}
	else
	{
		QueueNode* Next = ps->Head->next;
		free(ps->Head);
		ps->Head = Next;
	}
	ps->size--;
}

//查看队尾数据
QDataType QueueBack(Queue* ps)
{
	assert(ps);

	assert(!QueueEmpty(ps));    

	return ps->Tail->val;
}

//查看队头数据
QDataType QueueFront(Queue* ps)
{
	assert(ps);
	assert(!QueueEmpty(ps));

	return ps->Head->val;
}

//统计队列的数据个数
int QueueSize(Queue* ps)
{
	assert(ps);

	return ps->size;
}

//判断队列是否为空
bool QueueEmpty(Queue* ps)
{
	assert(ps);
	
	return ps->size == 0;
}


Queue.h文档的代码

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

typedef int QDataType;
typedef struct QueueNode
{
	QDataType val;
	struct QueueNode* next;
}QueueNode;

typedef struct Queue
{
	QueueNode* Head;
	QueueNode* Tail;
	int size;
}Queue;

//初始化函数
void InitQueue(Queue* ps);

//销毁函数
void DestroyQueue(Queue* ps);

//入队列
void QueuePush(Queue* ps, QDataType x);

//出队列
void QueuePop(Queue* ps);

//查看队尾数据
QDataType QueueBack(Queue* ps);

//查看队头数据
QDataType QueueFront(Queue* ps);

//统计队列的数据个数
int QueueSize(Queue* ps);

//判断队列是否为空
bool QueueEmpty(Queue* ps);


test.c文档的代码

#include "Queue.h"

void menu()
{
	printf("*************************************************************\n");
	printf("***    1.入列                       2.出列                ***\n");
	printf("***    3.查看队头数据               4.查看队尾数据        ***\n");
	printf("***    5.统计队列数据个数           6.判断队列是否为空    ***\n");
	printf("***    0.退出                                             ***\n");
	printf("*************************************************************\n");
}
int main()
{
	int input = 0;
	int num = 0;
	Queue q;
	InitQueue(&q);
	do
	{
		menu();
		printf("请选择:>\n");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			printf("请输入你要入列的数据\n");
			scanf("%d",&num);
			QueuePush(&q,num);
			break;
		case 2:
			QueuePop(&q);
			break;
		case 3:
			printf("%d\n",QueueFront(&q));
			break;
		case 4:
			printf("%d\n", QueueBack(&q));
			break;
		case 5:
			printf("%d\n", QueueSize(&q));
			break;
		case 6:
			if (QueueEmpty(&q) != true)
			{
				printf("队列非空\n");
			}
			else
			{
				printf("队列为空\n");
			}
			break;
		case 0:
			DestroyQueue(&q);
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

今天,队列实现代码总结就到这里,关注点一点,下期更精彩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值