【数据结构】 -- 队列

引入

队列是一种线性表,队列遵循先进先出的特性。先放入队列的数据,一定先出队列。

倘若数据以ABCD的顺序入队,出队的顺序一定也是ABCD。

队列的实现

队列要求先入先出,用数组实现要挪数据,效率非常低。双向链表实现非常方便但是占用内存比单链表多,所以在这里我们选择用单链表实现。

头文件:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<stdlib.h>

typedef int QDataType;

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

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;


//队尾插入
void QueuePush(Queue* pq, QDataType x);

//队头删除
void QueuePop(Queue* pq);

//初始化
void QueueInit(Queue* pq);

//销毁
void QueueDestory(Queue* pq);

//显示数据个数
int QueueSize(Queue* pq);

//取队头
QDataType QueueFront(Queue* pq);

//取队尾
QDataType QueueBack(Queue* pq);

//判空
bool QueueEmpty(Queue* pq);

这里的关键在于重新设置一个结构体Queue用来操作phead和ptaill,如果没有这个结构体,需要传入二级指针来实现,会更加复杂。同时Queue中的size还可以记录数据的个数;如果没有size需要计数器遍历链表才能得到链表的长度。

图示:

实现文件:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include "Queue.h"


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


//队尾插入
void QueuePush(Queue* pq, QDataType x)
{
	//扩容
	QNode* newNode = (QNode*)malloc(sizeof(QNode));
	if (newNode == NULL)
	{
		perror("mailloc fail");
		exit(-1);
	}
	newNode->next = NULL;
	newNode->val = x;

	if (pq->ptail == NULL)
	{
		pq->phead = pq->ptail = newNode;
	}
	else
	{
		pq->ptail->next = newNode;
		pq->ptail = newNode;
	}
	pq->size++;

}


//显示数据个数
int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

//队头删除
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->size != 0);
	if (pq->phead = pq->ptail)//一个节点
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
		pq->size--;
	}
	else//多个节点
	{
		QNode* cmp = pq->phead;
		free(pq->phead);
		pq->phead = cmp;
		pq->size--;
	}
}

//取队头
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->phead);

	return pq->phead->val;

}

//取队尾
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->ptail);

	return pq->ptail->val;
}



//判空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	
	return pq->size == 0;
}


//销毁
void QueueDestory(Queue* pq)
{
	assert(pq);

	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* cmp = pq->phead->next;
		free(cur);
		cur = cmp;
		pq->size--;
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

测试文件:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"


int main()
{
	Queue s;
	QueueInit(&s);
	QueuePush(&s, 1);
	QueuePush(&s, 2);
	QueuePush(&s, 3);

	int b = QueueFront(&s);
	QueuePush(&s, 4);
	
	QueuePop(&s);


	QueueDestory(&s);
	return 0;
}
相关推荐
东华万里31 分钟前
第31篇 数据结构入门:顺序表
数据结构·大学生专区
Vect__1 小时前
Go 数据结构 slice 深度剖析
开发语言·数据结构·golang
青山木2 小时前
Hot 100 --- LRU 缓存
java·数据结构·算法·leetcode·链表·缓存·哈希
剑挑星河月3 小时前
35.搜索插入位置
java·数据结构·算法·leetcode
闪电悠米4 小时前
力扣hot100-438.找到字符串中所有字母异位词-固定长度滑动窗口详解
linux·服务器·数据结构·算法·leetcode·滑动窗口·力扣hot100
人道领域4 小时前
【LeetCode刷题日记】51.N皇后
数据结构·算法
金融小师妹18 小时前
人工智能推演框架:非农降温信号如何重构黄金定价模型
数据结构·人工智能·机器学习·transformer
ysa05103020 小时前
【并查集】判环,深搜
数据结构·c++·算法·深度优先
.Hypocritical.1 天前
数据结构笔记——链表成环/反转 + 有序二叉树(BST)构建、遍历、删除
java·数据结构
CSharp精选营6 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型