接觸過一點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基礎學算法系列就到這裏吧,最後麻煩你點贊👍,還有關注➕,關注我,會給你帶來更多的算法學習,最後若是你想鞏固知識,洛谷上有題,最後再強調一遍,若是你喜歡個人博客,請關注我,之後會有更多精彩內容