很多人都看過棧和隊列了吧?那豈不是我沒有說的意義了?那好,我就做這個記錄,等我老了還可以給孫子學棧和隊列,嘿嘿
棧和隊列一個先進後出,一個先進先出,棧就是一個狗洞,你爬進去之後因為空白間太小不許你翻身,所以想出來就的往後挪,當然要是有人用棍子頂住你菊花那你就出不去了,嘿嘿,隊列就是你人品好一點,找到的這個狗洞的主人比較勤快,已經把洞挖通了,所以對面就是出口,但是你一進去之後狗狗就發現你了,跟狗搶洞,你不是找抽嗎?難道這時你還想你能往後挪?所以就拚命往前沖,神馬演算法啊,先一邊去,保住菊花再說,這回先進後出跟先進先出你該有印象了吧?還沒印象的話那我這流氓式教育還真是失敗
棧和隊列可以是使用STL裡面的,也可以自己用數組類比,根據具體功能,叫你類比出一個棧或者隊列,NTM別說你不行,是男人就不能說不行,那就跳過類比了咯,直接介紹STL裡面的,在STL裡面有棧和隊列,我是這樣理解的,他們就是容器,和int一樣,你能用int定義整形變數,我就能用stack和queue來定義棧和隊列,然後你就想象有這麼個空間,他的名字就是棧或者隊列,然後對他的操作就只能是STL裡面的那幾個固定的函數,發現那句經典台詞了沒?自己想象有這麼個東西,然後吃透各個函數的意義,那棧和隊列還不被你搞死搞殘啊?函數一共也就11個,當然我這裡是介紹的基礎的咯,隊列還有雙向隊列和優先隊列,這裡先不講,為什嗎?難道你硬要我告訴你我還不會?擦,那你大大滴不行啊!
我就先把函數都放這裡咯,省得神經兮兮的人還要去找度娘的麻煩
棧:#include<stack>這個是定義的標頭檔,懂?
stack<INT> s;我定義一個INT類型的棧s,INT是隨你的,你想棧裡面裝int就寫int,double就寫double,最好的一點,嘿嘿,還可以是結構體哦~~
s.empty()判斷棧是否是空的,是空的就返回真,不然就是假,所以這個是常常用在if和while裡面應該不用我說吧?
s.top()返回棧頂元素,你要寫a=s.top()的話那麼a就被賦值成棧頂元素了,懂?記住,只是返回,但不改變棧裡面的內容,也就是沒有刪除棧頂元素
s.pop()剛剛說了不會刪除,現在這個就是用來刪除棧頂元素的,沒有傳回值,就直接單個單個的用就是了,不過可別對空棧用的,裡面本來就沒東西,你還要從裡面丟出點東西來,NTM是不是成心的咯?
s.size()返回棧裡面有多少元素,就是用來確定棧裡面的元素數量的,要是我要求你不許 在棧裡面放5個以上的元素,那你是不是就會用上他了咯?不過貌似也不用,嘿嘿,進棧就直接記錄好了
s.push()進棧的函數啊,比如我要a進棧,我就直接寫s.push(a);你懂用法了?不懂?NTM去死好不?
隊列:#include <queue>這個是隊列定義的標頭檔
queue<INT> q;這裡的INT和棧一樣的,別說需要我來給你講解,自己看前面
q.empty(); q.pop(); q.size(); q.push();這些都是和棧一樣的用法,別浪費表情~
q.back(); q.front();這兩個是隊列的的返回方式,這就是隊列有6個函數而棧只有5個的原因,小子,學過English木有?back是後front是前,我翻譯的沒錯吧?錯了也不管了,記住,back是返回的隊尾的元素,front是返回的隊首的元素,用法和棧裡面那個top一樣,但是為什麼隊列不同top呢?我當時也納悶,不過啊,嘿嘿,我提前告訴你,優先隊列把他強姦了,所以top就是他的人了,top在優先隊列裡面用來返回優先順序最高的元素,我沒學,所以不多少,免得別人說我關公背後玩小刀
我的站和隊列就over了列?還沒懂?往左邊看咯,是不是木有門?對了,再講一遍----no door(自己合成的此,不知道文法對不^^!)
舉個例子?
丫的好險好險,還好上傳了一個,不然還的臨時敲代碼
棧:
愚人節的禮物
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3347 Accepted Submission(s): 2047
Problem Description四月一日快到了,Vayko想了個愚人的好辦法——送禮物。嘿嘿,不要想的太好,這禮物可沒那麼簡單,Vayko為了愚人,準備了一堆盒子,其中有一個盒子裡面裝了禮物。盒子裡面可以再放零個或者多個盒子。假設放禮物的盒子裡不再放其他盒子。
用()表示一個盒子,B表示禮物,Vayko想讓你幫她算出愚人指數,即最少需要拆多少個盒子才能拿到禮物。
Input本題目包含多組測試,請處理到檔案結束。
每組測試包含一個長度不大於1000,只包含'(',')'和'B'三種字元的字串,代表Vayko設計的禮物透視圖。
你可以假設,每個透視圖畫的都是合法的。
Output對於每組測試,請在一行裡面輸出愚人指數。
Sample Input
((((B)()))())(B)
Sample Output
41
#include <iostream> #include <cstring> #include <stack> //我是想練習隊列和棧來做它,這個題隊列和棧一樣可以做 using namespace std; stack<int> s; int main (void) { int i,j,k,l; char a[1111]; while(cin>>a) { l=strlen(a); for(i=0;i<l;i++) if(a[i]=='(') s.push(1); //是左括弧就進棧一個1 else if(a[i]==')') s.pop(); //是右括弧就出棧一個 else break; //不是括弧就可以結束了 i=0; while(!s.empty()) //棧內是否為空白 i++,s.pop(); //記錄數加一個,出棧一個 cout<<i<<endl; } return 0; }
妹妹的貼過來的就是醜啊,還是黑白電視機,我還以為我穿越回到解放前了咯!
隊列:
士兵隊列訓練問題
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2567 Accepted Submission(s): 1160
Problem Description某部隊進行新兵隊列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。
Input本題有多個測試資料群組,第一行為組數N,接著為N行新兵人數,新兵人數不超過5000。
Output共有N行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有一個空格。
Sample Input
22040
Sample Output
1 7 191 19 37
#include <iostream> #include <queue> using namespace std; queue<int> s; void cmp(int k) { int i=1; while(s.front()!=0) { if(i%k!=0) //把留下來的方隊尾 s.push(s.front()); s.pop();i++; //去掉隊首 }s.pop();s.push(0); //把隊首的0去掉,在隊尾加上0 } int main (void) { int t,n,i,j,k,l; cin>>t; while(t--&&cin>>n) { for(i=1;i<=n;i++) s.push(i);s.push(0); //每次在屁股加上個0 i=1; while(s.size()>4) //因為加上了0,所以長度小於等於4就退出 { if(i%2==0)cmp(3); //選擇數三下踢一個人還是數兩下踢一個人 else cmp(2); i++; }i=0; while(!s.empty()) //查看隊列中是不是為空白 { if(s.front()>0) //因為隊尾還有個0,這個是不用輸出的但是為了清空隊列,還是要pop他 { if(i)cout<<" ";i=1; cout<<s.front(); } s.pop(); }cout<<endl; } return 0; }
愚人節的禮物
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3347 Accepted Submission(s): 2047
Problem Description四月一日快到了,Vayko想了個愚人的好辦法——送禮物。嘿嘿,不要想的太好,這禮物可沒那麼簡單,Vayko為了愚人,準備了一堆盒子,其中有一個盒子裡面裝了禮物。盒子裡面可以再放零個或者多個盒子。假設放禮物的盒子裡不再放其他盒子。
用()表示一個盒子,B表示禮物,Vayko想讓你幫她算出愚人指數,即最少需要拆多少個盒子才能拿到禮物。
Input本題目包含多組測試,請處理到檔案結束。
每組測試包含一個長度不大於1000,只包含'(',')'和'B'三種字元的字串,代表Vayko設計的禮物透視圖。
你可以假設,每個透視圖畫的都是合法的。
Output對於每組測試,請在一行裡面輸出愚人指數。
Sample Input
((((B)()))())(B)
Sample Output
41
#include <iostream> #include <cstring> #include <stack> //我是想練習隊列和棧來做它,這個題隊列和棧一樣可以做 using namespace std; stack<int> s; int main (void) { int i,j,k,l; char a[1111]; while(cin>>a) { l=strlen(a); for(i=0;i<l;i++) if(a[i]=='(') s.push(1); //是左括弧就進棧一個1 else if(a[i]==')') s.pop(); //是右括弧就出棧一個 else break; //不是括弧就可以結束了 i=0; while(!s.empty()) //棧內是否為空白 i++,s.pop(); //記錄數加一個,出棧一個 cout<<i<<endl; } return 0; }
士兵隊列訓練問題
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2567 Accepted Submission(s): 1160
Problem Description某部隊進行新兵隊列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。
Input本題有多個測試資料群組,第一行為組數N,接著為N行新兵人數,新兵人數不超過5000。
Output共有N行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有一個空格。
Sample Input
22040
Sample Output
1 7 191 19 37
#include <iostream> #include <queue> using namespace std; queue<int> s; void cmp(int k) { int i=1; while(s.front()!=0) { if(i%k!=0) //把留下來的方隊尾 s.push(s.front()); s.pop();i++; //去掉隊首 }s.pop();s.push(0); //把隊首的0去掉,在隊尾加上0 } int main (void) { int t,n,i,j,k,l; cin>>t; while(t--&&cin>>n) { for(i=1;i<=n;i++) s.push(i);s.push(0); //每次在屁股加上個0 i=1; while(s.size()>4) //因為加上了0,所以長度小於等於4就退出 { if(i%2==0)cmp(3); //選擇數三下踢一個人還是數兩下踢一個人 else cmp(2); i++; }i=0; while(!s.empty()) //查看隊列中是不是為空白 { if(s.front()>0) //因為隊尾還有個0,這個是不用輸出的但是為了清空隊列,還是要pop他 { if(i)cout<<" ";i=1; cout<<s.front(); } s.pop(); }cout<<endl; } return 0; }