Bootstrap

数据结构初阶之队列的介绍与队列的实现

一、概念与结构

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

二、队列的实现

项目创建的时候,要创建一个头文件(.h)Queue.h ,两个源文件(.c)Queue.c ,test.c 。Queue.h 用于定义结构体和声明函数;Queue.c 用于实现函数;test.c 用于测试函数,每实现一个函数要进行相应的测试。编写代码过程中要勤测试,避免写出大量代码后再测试,如果出现问题,问题无从定位。

1、Queue.h

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


//定义结点的结构
typedef int DataType;
typedef struct QueueNode
{
    DataType* data;
    struct QueueNode* next;
}QueueNode;

//定义队列的结构
typedef struct Queue
{
    QueueNode* phead;
    QueueNode* ptail;
    int size;
}Queue;

//初始化队列
void Init_Queue(Queue* pq);

//判断队列是否为空
bool Empty_Queue(Queue* pq);

//销毁队列
void Destory_Queue(Queue* pq);

//入队—队尾入
void Push_Queue(Queue* pq, DataType x);

//出队—队头出
void Pop_Queue(Queue* pq);

//取队头数据 
DataType Get_Head_Queue(Queue* pq);

//取队尾数据 
DataType Get_Tail_Queue(Queue* pq);

//求队列有效元素个数 
int Size_Queue(Queue* pq);

2、Queue.c

#include"Queue.h"

//初始化队列
void Init_Queue(Queue* pq)
{
    assert(pq);
    pq->phead = pq->ptail = NULL;
    pq->size = 0;
}

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

//销毁队列
void Destory_Queue(Queue* pq)
{
    assert(pq);
    QueueNode* pcur = pq->phead;
    while (pcur)
    {
        QueueNode* next = pcur->next;
        free(pcur);
        pcur = NULL;
        pcur = next;
    }
    pq->phead = pq->ptail = NULL;
    pq->size = 0;
}

//入队列—队尾入
void Push_Queue(Queue* pq, DataType x)
{
    assert(pq);
    QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
    if (!newnode)
    {
        perror("malloc fail!");
        exit(1);
    }
    newnode->data = x;
    newnode->next = NULL;

    //若队列为空
    if (!pq->phead)
    {
        pq->phead = pq->ptail = newnode;
    }
    //队列不为空
    else
    {
        pq->ptail->next = newnode;
        pq->ptail = pq->ptail->next;
    }
    pq->size++;
}

//出队—队头出
void Pop_Queue(Queue* pq)
{
    assert(!Empty_Queue(pq));
    //只有一个结点的情况
    if (pq->phead == pq->ptail)
    {
        free(pq->phead);
        pq->phead = pq->ptail = NULL;
    }
    //两个及以上的结点
    else
    {
        QueueNode* next = pq->phead->next;
        free(pq->phead);
        pq->phead = next;
    }
    pq->size--;
}

//取队头数据 
DataType Get_Head_Queue(Queue* pq)
{
    assert(!Empty_Queue(pq));
    return pq->phead->data;
}

//取队尾数据 
DataType Get_Tail_Queue(Queue* pq)
{
    assert(!Empty_Queue(pq));
    return pq->ptail->data;
}

//求队列有效元素个数 
int Size_Queue(Queue* pq)
{
    return pq->size;
}

test.c自行测试,这里不予提供。

;