欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 队列的实现

队列的实现

2025/3/22 4:28:06 来源:https://blog.csdn.net/wyuchen123/article/details/140869470  浏览:    关键词:队列的实现

         这是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;elsereturn 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;elsereturn 0;
}
        代码解释

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


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


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

点个赞,关注一下呗~

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com