数据结构队列的实现

在这里插入图片描述
今天我们来讲队列是怎么实现的,队列听名字和生活中的排队是很相似的,排队我们都知道,比如我们要排队去取餐(突然想到今天是疯狂星期四,今天的晚饭有着落了),我们肯定是先给第一个取餐,取完餐之后就是下一个,这个时候第二个就变成第一个来取餐,不能插队的情况下,如果这个时候有人也想吃这个,就要到队尾进行排队来等餐,显然队列就和这个十分的相似,今天我们就简答的实现队列的一些基本接口函数。

首先还是来看一下我们的结构体的定义是个什么样子的,我们这里用的是单链表的思路,为什么不用顺序表是因为顺序表移动数据很麻烦,我们要求队列是先进先出,所以这里用单链表是最合适的,那结构体的定义就是下面的这个。

typedef int QueueDateType;
typedef struct QueueNode
{
	QueueDateType val;
	struct QueueNode* next;

}QNode;

在这里我们还有一个很好的办法就是定义两个头尾指针,这样的话我们删除是删除头,入队列就是尾巴,我们改变为尾指针的话只要在后面插入,改变的是结构体的内容,用一级指针就可以,但是如果我们要改变头指针的话,还是需要注意的一个点就是头指针是改变指向,需要二级指针才可以,那我们可以在继续定义一个结构体就不需要,首先一个结构体放着是头尾指针,是改变内容,然后头尾指针又是一个指针,但是在结构体中他们是属于内容,一级指针就可以对他们进行改变,这就不需要我们来继续定义一个二级指针。


typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
}Queue;

因为我们后面有个接口函数来判断这个队列是不是为空,所以我们这里给个size,有数据进就++,出数据就–,我们马上来实现下面的几个接口函数,首先就是初始化,初始化其实初始化的时我们Queue这个结构体,而不是QNode这个结构体,大家可不要搞错了,队列其实你只要对这两个结构体的作用知道,就解决一半的问题了。

初始化

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = NULL;
	pq->tail = NULL;
	pq->size = 0;
}

初始化之后就是入对列,相当于我们开节点然后进行尾插

void QueuePush(Queue* pq, QueueDateType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->next = NULL;
	newnode->val = x;

	if (pq->head == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	pq->size++;
}

就是单链表的思路,下一个是pop,相当于头删

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->size > 0);
	assert(pq->head);

	QNode* del = pq->head;
	pq->head = pq->head->next;
	free(del);
	del = NULL;
	if (pq->head == NULL)
		pq->tail = NULL;


	pq->size--;
}

我们在给一个判读队列是不是为空的函数

bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->head == NULL;
}

因为队列最大的好处就是入队列是在尾入的,出队列是在头出的,我们最好再写两个接口函数一个是获得头的数据,一个是获得尾的数据,所以这里有两个其他的接口函数需要实现

QueueDateType QueueHead(Queue* pq)
{
	assert(pq);
	assert(pq->head);
	return pq->head->val;
}


QueueDateType QueueTail(Queue* pq)
{
	assert(pq);
	assert(pq->tail);
	return pq->tail->val;
}

还有一个接口函数就是来获得size
这个很简单,因为一开始结构体的定义就是给了size,直接返回就行了

int QueueSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}

完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = NULL;
	pq->tail = NULL;
	pq->size = 0;
}

void QueuePush(Queue* pq, QueueDateType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->next = NULL;
	newnode->val = x;

	if (pq->head == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	pq->size++;
}



void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->size > 0);
	assert(pq->head);

	QNode* del = pq->head;
	pq->head = pq->head->next;
	free(del);
	del = NULL;
	if (pq->head == NULL)
		pq->tail = NULL;


	pq->size--;
}

bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->head == NULL;
}


QueueDateType QueueHead(Queue* pq)
{
	assert(pq);
	assert(pq->head);
	return pq->head->val;
}


QueueDateType QueueTail(Queue* pq)
{
	assert(pq);
	assert(pq->tail);
	return pq->tail->val;
}


int QueueSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}

Queue.h

#pragma once


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

typedef int QueueDateType;
typedef struct QueueNode
{
	QueueDateType val;
	struct QueueNode* next;

}QNode;


typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
}Queue;


void QueueInit(Queue* pq);


void QueuePush(Queue* pq, QueueDateType x);


void QueuePop(Queue* pq);


bool QueueEmpty(Queue* pq);


QueueDateType QueueHead(Queue* pq);



QueueDateType QueueTail(Queue* pq);


int QueueSize(Queue* pq);

那队列也是简单的实现了,我们后面还会分享和队列有关的题目,比如用栈实现队列,用队列实现栈

下次再见

在这里插入图片描述

  • 41
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 33
    评论
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在冬天去看海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值