手搓数据结构之队列queue C/C++语言版(BFS算法预备知识)

一.队列介绍

队列这种数据结构其实就是来源于我们的生活中,食堂买饭,超市结账......我们都是先来先买/先来先结算,后来的就乖乖在队尾等着。

如图所示:1号结完账就先走,这时12号来了就排在末尾。

这种先进先出(First In First Out)的线性序列就被称为队列。队列也是一种线性表,只不过它是操作受限的线性表,只能在两端操作:一端进,一端出。进的一段称为队尾,出的一端称为队头。队列可以用顺序存储,也可以用链式存储。

二.模拟实现队列

对于C语言的朋友,我们可以使用数组来实现队列,在竞赛中也常使用这种方法。

下面我将一步一步带大家实现—》

首先我们需要先定义一个数组来存储数据,以及两个变量来存储队头/队尾在数组中的位置。

int queue[max];
int head = 0;//队首指针
int tail = 0;//队尾指针

1.入队

void queue_push(int x)
{
    if (tail >= max)//需要判断当前数组是否满了
    {
        printf("overflow");
    }
    else
    {
        queue[tail] = x;//在队尾添加上数据
        tail++;
    }
}

2.出队

void queue_pop()
{
    if (head==tail)//弹出队首元素,需要判断队列元素是否为空
    {
        printf("empty");
    }
    else
    {
        head++;//实际我们没有删除该元素,但是我们将队首位置改变也起到了相同效果。
    }
}

3.查询

//查询队首元素(也可以查询队尾元素)
int queue_front()
{
    if (head == tail)
    {
        printf("empty");
        return -1;
    }
    else
    {
        return queue[head/tail];
    }
}

//查询元素个数:tail-head+1

三.C++STL提供的queue容器

C++已经提供了queue容器及其接口,我们只需包含一下头文件就可用啦! 我把常用的代码直接附在下面。

#include <iostream>
using namespace std;
#include <queue>

int main()
{
    //默认构造方式构造一个队列容器
    queue<int> q1;//创建一个队列 格式:queue<数据类型>随便取个名字

    //入队
    q1.push(1);
    q1.push(2);
    q1.push(3);
    //访问队首/队尾
    cout << q1.front() << endl;

    cout << q1.back() << endl;
    //删除队首
    q1.pop();
    //遍历队列里所有元素
    while (q1.empty() != true)
    {
        cout << q1.front() << endl;
        q1.pop();
    }

    //赋值
    q1.front() = 100;
    //查询元素总数
    cout << "size:" << q1.size() << endl;
    return 0;
}

OK!本篇文章就结束啦。有问题欢迎评论区留言,你的点赞关注收藏就是对俺的最大鼓励,谢谢啦。