队列的实现

         这是C++算法基础-数据结构专栏的第二十三篇文章,专栏详情请见此处


引入

        队列是一种常用的一种线性数据结构。它多用于在BFS(Breadth First Search,宽(广)度优先搜索)中存储数据。

        下面我们就来讲队列的实现。

定义

        队列(queue)是一种具有「先进入队列的元素一定先出队列」性质的表。由于该性质,队列通常也被称为先进先出(first in first out)表,简称 FIFO 表。

过程

        队列,一听这个名字,我们就会想起排队时的情景:先进来排队的人会先从另一边出来,这就叫先进先出,队列就是这样的一种数据结构。

        我们接下来要学习五种队列的最主要操作:构建,插入(写入)数据、删除数据、取队头值、判断队列是否为空

        构建队列

        我们先定义一个数组que[],用来表示队列,接着还需要两个变量hhtt,用来表示队头和队尾。刚开始hh=0tt=-1

Q:为什么刚开始要hh=0tt=-1呢?

A:这是整个队列的实现的重要一点,理解了它就能把整个模拟队列理解。当队列中只有一个元素时,这个元素即是队头也是队尾,所以 hhtt都要指向此元素,所以当队列为空时,就必须tt=-1。当然,这只是我习惯上的做法,若你初始时hh=tt=0,那么就意味着tt指向队列中最后一个元素的后一个位置,方法是可以灵活变换的

        向队尾插入(写入)数据

        先在队尾进行数据赋值,然后将tt++

        从队头弹出数据

        直接hh++,使队头减少一层。

Q:将队头减少一层,队列中还有刚刚的数据,直接做会不会有问题呢?

A:没有关系,将队头减少一层,就无法访问刚才的数据了。所以,直接操作队头就可以实现了。

        取队头值

        输出que[hh]的值即可。

        判断队列是否为空

        判断队头和队尾的关系,若hh>tt,说明队列为空,反之也成立。

        值得一提的是,y总在常用代码模板2——数据结构中给出了一种循环队列的实现方式,这里我就不讲解了,只会将代码整理并展现出来。

性质

        时间复杂度

        上述关于队列的操作,时间复杂度都是O(1)的。

代码

        下面给出队列的实现代码:

1.普通队列:

int que[N],hh=0,tt=-1;

void push(int x){
    que[++tt]=x;
}

void pop(){
    hh++;
}

int top(){
    return que[hh];
}

bool empty(){
    if(hh>tt) 
        return 1;
    else
        return 0;
}

--------------------------------------------------

2.循环队列:

int que[N],hh=0,tt=0;

void push(int x){
	que[tt++]=x;
	if(tt==N)
		tt=0;
}

void pop(){
    hh++;
    if(hh==N)
	    hh=0;
}

int top(){
    return que[hh];
}

bool empty(){
    if(hh==tt) 
        return 1;
    else
        return 0;
}
        代码解释

        第一行的各种变量和数组已经在前面讲解了,这里不再详细讲解;push()函数的作用是向队尾插入(写入)数据;pop()函数的作用是从队头弹出数据;top()函数的作用是取队头值;empty()函数的作用是判断队列是否为空。第二种循环队列的解释也是一样的。


上一篇-表达式求值问题的实现    C++算法基础专栏文章    下一篇-单调栈的实现


每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容

点个赞,关注一下呗~

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值