队列(单链表实现)

//栈与队列的对比
//1、栈
//1.1 栈的概念和结构
//栈:一种特殊的线性表,其只允许在特殊的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。
//栈中的数据元素遵守后进先出 LIFO(Last In First Out)的原则。
//压栈:栈的插入操作叫做进栈\压栈\入栈,入数据在栈顶。
//出栈:栈的删除操作叫做出栈。出数据也在栈顶。
// 
//1.2 栈的实现
//栈的实现一般可以使用数组或链表实现。相对而言,数组的结构实现更优一些,因为数组在尾上插入数据的代价比较小。

//2、队列
//2.1 队列的概念与结构
//队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列的特点是:先进先出FIFO(First In First Out)
//入队列:进行插入操作的一端称为队尾。
//出队列:进行删除操作的一端称为队头。

//2.2 队列的实现
//队列也可以使用数组和链表的结构实现,使用链表结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

Test.c

#include "Queue.h"

void TestQueue()
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	QueuePush(&q, 5);

	while (!QueueEmpty(&q))
	{
		printf("%d ",QueueFront(&q));//取出一个对头的数据
		QueuePop(&q); //去除之后要删除掉
	}
	printf("\n");
}


int main()
{
	TestQueue();

	return 0;
}

Queue.h

#define _CRT_SECURE_NO_WARNINGS 1

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>


//数据类型的申明
typedef int QDataType;
typedef struct QueueNode //定义一个队列结点
{
	struct QueueNode* next;
	QDataType data;

}QNode;

typedef struct Queue //定义一个队列(由多个队列结点组成)
{
	int size;  //记录队列的节点个数
	QNode* head; //便于队首删除数据
	QNode* tail; //便于队尾插入数据
}Queue;


//接口(函数)的申明
void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
void QueuePush(Queue* pq,QDataType x); //对尾插入一个数据
void QueuePop(Queue* pq);             //队头删除一个数据
QDataType QueueFront(Queue* pq);//取对头的一个数据
QDataType QueueBack(Queue* pq); //取队尾的一个数据
bool QueueEmpty(Queue* pq); //判断队列是否为空
int QueueSize(Queue* pq); //计算队列的结点个数

Queue.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"

void QueueInit(Queue* pq) //初始化队列
{
	assert(pq);
	pq->size = 0;
	pq->head = pq->tail = NULL;
}

void QueueDestroy(Queue* pq)  //对队列中申请的空间进行销毁
{
	assert(pq);
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next; //先保存下一个结点
		free(cur);
		cur = next; //cur后移一个
	}

	pq->head = pq->tail = NULL; //删除完所有节点之后,将head、tail置为空。
}

void QueuePush(Queue* pq, QDataType x) //对尾插入一个数据(尾插)
{
	assert(pq);
	QNode* newnode=(QNode*)malloc(sizeof(QNode));
	if (NULL==newnode)
	{
		printf("malloc fail\n");
		exit;
	}
	newnode->data = x;
	newnode->next = NULL; //尾插一个新结点

	if (NULL==pq->tail) //若队列为空
	{
		pq->head = pq->tail = newnode;
	}
	else //若队列不为空
	{
		pq->tail->next = newnode; //先将newnode链接在tail后面
		pq->tail = newnode; //再后移tail
	}
	pq->size++;
}

void QueuePop(Queue* pq) //队头删除一个数据(头删)
{
	assert(pq);
	assert(!QueueEmpty(pq)); //没有结点时报错
	if (NULL==pq->head->next) //只剩下一个结点时
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else //剩下多个结点
	{
		QNode* next = pq->head->next; //先保存head的下一个结点
		free(pq->head);
		pq->head = next; //head后移一个
	}
	pq->size--;
}

QDataType QueueFront(Queue* pq) //取对头的一个数据
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->head->data;
}

QDataType QueueBack(Queue* pq) //取队尾的一个数据
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->tail->data;
}

bool QueueEmpty(Queue* pq) //判断队列是否为空
{
	assert(pq);
	return NULL == pq->head;
}


int QueueSize(Queue* pq) //计算队列的结点个数
{
	return pq->size;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值