快捷搜索: 王者荣耀 脱发

【数据结构:队列】基本特点、定义及实现

数据结构:队列

队列:Queue 特点:先进先出,堆存储 【适合:头部取出,尾部添加】 允许在表的前端(front)进行删除操作 而在表的后端(rear)进行插入操作

先进先出(FIFO—first in first out)线性表 必须为其静态分配或动态申请一片连续的存储空间 并设置两个指针进行管理。 一个是队头指针front,它指向队头元素; 另一个是队尾指针rear,它指向下一个入队元素的存储位置

头文件

#pragma once

#include <stdio.h>
#include <malloc.h>

typedef int QuDataType;
// 链式结构:表示队列
typedef struct QListNode
{
          
   
	struct QListNode* _next;
	QuDataType _data;
}QueueNode;

// 队列的结构
typedef struct Queue
{
          
   
	QueueNode* _front;
	QueueNode* _rear;
}Queue;

// 初始化队列
void QueueInit(Queue* q);

// 队尾入队列
void QueuePush(Queue* q, QuDataType data);

// 队头出队列
void QueuePop(Queue* q);

// 获取队列头部元素
QuDataType QueueFront(Queue* q);

// 获取队列队尾元素
QuDataType QueueBack(Queue* q);

// 获取队列中有效元素个数
int QueueSize(Queue* q);

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q);

// 销毁队列
void QueueDestroy(Queue* q);

实现

#include "Queue.h"
//一个数据入队列必须要先创建节点
QueueNode * BuyQueueNode(QuDataType x)    //创建节点并初始化此节点
{
          
   
	QueueNode * cur = (QueueNode *)malloc(sizeof(QueueNode));
	cur->_data = x;
	cur->_next = NULL;
	return cur;
}
void QueueInit(Queue* q) //初始化队列结构
{
          
   
	q->_front = NULL;
	q->_rear = NULL;
}
void QueuePush(Queue* q, QuDataType x)  //队列尾部入数据
{
          
   
	QueueNode * cur = BuyQueueNode(x);  //先把创建好的节点传过来
	if (q->_front == NULL)             //若是队列本身为空,队列里就只有这一个节点,又为队列头又为队列尾
	{
          
   
		q->_front = q->_rear = cur; 
	}
	else
	{
          
   
		q->_rear->_next = cur; //否则,链表尾插操作
		q->_rear = cur;
	}
}
void QueuePop(Queue* q)     //队列头部出数据
{
          
   
	if (q->_front == NULL)    //本身队列为空,不做操作
	{
          
   
		return;
    }
	QueueNode* tmp = q->_front->_next;   //先保留下一个节点,防止断链
	free(q->_front);
	q->_front = tmp;   //更新对列头部
}
QuDataType QueueFront(Queue* q)   //获取队列首部元素
{
          
   
	return q->_front->_data;
}
QuDataType QueueBack(Queue* q)//获取队列尾部元素
{
          
   
	return q->_rear->_data;
}
int QueueEmpty(Queue* q)   //判断队列是否为空
{
          
   
	return q->_front == NULL;   //为空,返回1
}
int QueueSize(Queue* q)  //获取队列中的元素个数
{
          
   
	QueueNode * cur;
	int count = 0;
	for (cur = q->_front; cur; cur = cur->_next)//循环遍历,计数即可
	{
          
   
		count++;
	}
	return count;
}
void QueueDestory(Queue* q)  //销毁队列
{
          
   
	if (q->_front == NULL)
	{
          
   
		return;
	}
	while (q->_front)
	{
          
   
		QueuePop(q);//对每一个元素迭代出队即可
	}
}
经验分享 程序员 微信小程序 职场和发展