接触过一点oi的应该都知道,在初赛试题中,总会考一些关于栈,队列,类的知识,而由于队列或栈须要额外的头文件,因此有的同窗就不知道这方面的内容,然而这个队列(栈)也是一个很是经常使用的一个技巧类的东西,你要是会有可能就比别人抢到先机,那么,今天我就教你们抢夺先机。在抢夺先机以前,可不能够先关注我呢,关注我能够持续为你带来多样的算法知识😁ios
首先咱们学队列的话,要先搞清楚他的运行方式,由于他很容易和栈搞混,他和栈的区别就在于,队列是先进先出,栈是先进后出,跟你们解释一下吧,在队列中(或栈)是没有下标的,不像数组里能够定点打击,把对应下标的值取出来,他们只能按照顺序一个一个取,放固然也是顺序放入,给你们看一个图就知道什么意思了算法
这样就很清晰了,大体了解他工做过程后咱们就能够开始看代码了数组
今天咱们主要是讲队列,栈会在之后讲,若是你期待讲栈的话,记得关注我函数
一,定义一个队列学习
队列和string同样是须要额外的头文件,也和他同样是个数据类型,若是你要使用队列,你须要先添加头文件queue,而后再在程序中定义队列,定义方法为queue<数据类型> 队列名; 而后你就能够经过队列名来调用队列了。spa
二,队列的溢出code
若是还有新元素进行入队列容易形成假溢出。blog
假溢出:顺序队列因屡次入队列和出队列操做后出现的尚有存储空间可是不能进行入队操做的溢出。队列
真溢出:顺序队列的最大存储空间已经存满而又要求进行入队列操做所引发的溢出。 ci
事实上你基本不用担忧溢出的状况,首先是由于溢出状况并很少见,更重要的是若是你一直想着怎么防止溢出,会阻断你的思考
三,队列的基本操做
队列在经定义后,就能够进行一些基本操做了,基本操做包括入队,出队,判断是否为空队列,检测有多少元素在其中,固然还有提取队列顶部和底部的元素的操做,给你们综合看一下代码的效果吧
#include<queue> using namespace std; int main(){ queue<int> q; q.empty(); //若是队列为空返回true,不然返回false q.size(); //返回队列中元素的个数 q.pop(); //删除队列首元素但不返回其值 q.front(); //返回队首元素的值,但不删除该元素 q.push(); //在队尾压入新元素 q.back(); // 返回队列尾元素的值,但不删除该元素 return 0; }
上面我是定义了一个q,并集合了他的经常使用的操做,但没有进行输出,当中的队首指的是第一个入队的,队尾是最后一个入队的,上面定义的队列是整型的,你也能够定义长整型,字符型等等,而q.xxx指对队列q调用函数xxx,别忘了在后面打括号,大体熟悉了一下队列的基本操做后就去实战一下吧
洛谷实战题讲解
P1996https://www.luogu.com.cn/problem/P1996请独立完成不要看题解,若是不会就继续看我讲解
我但愿你是这的思考过的,不必定要想出来,可是请必定本身尝试一番,无论你会也好,不会也罢,你都继续看这篇博文就对了。
这道题应该是很是经典的,你们应该不只在新人时期作过这题,以前数学课也有讲过吧,约瑟夫问题的作法不少样能够用数组作,或者模拟他的过程,但今天这道题,我要告诉大家,能够用队列作!在作以前,确保你打开了约瑟夫问题,手上有笔纸,并编译器没有bug,肯定以后,咱们就开始吧。
这道题也是我新人时期作的题,首先,要输入m和n两个数,n决定了一圈有多少人,m决定了数几个数出去一人,那么确定是要有计数的变量来不断的数人出去啊,而后咱们能够经过队列将数到的人弹出去,好了,咱们能够先用第一弹讲过的流程图来梳理一下
如今,思路已经很清晰了,那么咱们就来代码实现吧
#include <iostream> #include <queue> using namespace std; int main() { queue<int>q; int n,m,s=1; cin>>n>>m; for(int i=1;i<=n;i++) { q.push(i); } while(!q.empty()) { if (s==m) { cout<<q.front()<<" "; q.pop(); s=1; } else { q.push(q.front()); q.pop(); s++; } } return 0; }
你看,约瑟夫问题这么容易的写出来了,流程图帮咱们梳理了思路后代码实现都不是问题,重点是你思路要清晰,并能够熟练使用算法,这样作题效率就会很高。
今天的0基础学算法系列就到这里吧,最后麻烦你点赞👍,还有关注➕,关注我,会给你带来更多的算法学习,最后若是你想巩固知识,洛谷上有题,最后再强调一遍,若是你喜欢个人博客,请关注我,之后会有更多精彩内容