小學生玩ACM—-棧和隊列

來源:互聯網
上載者:User

很多人都看過棧和隊列了吧?那豈不是我沒有說的意義了?那好,我就做這個記錄,等我老了還可以給孫子學棧和隊列,嘿嘿

     棧和隊列一個先進後出,一個先進先出,棧就是一個狗洞,你爬進去之後因為空白間太小不許你翻身,所以想出來就的往後挪,當然要是有人用棍子頂住你菊花那你就出不去了,嘿嘿,隊列就是你人品好一點,找到的這個狗洞的主人比較勤快,已經把洞挖通了,所以對面就是出口,但是你一進去之後狗狗就發現你了,跟狗搶洞,你不是找抽嗎?難道這時你還想你能往後挪?所以就拚命往前沖,神馬演算法啊,先一邊去,保住菊花再說,這回先進後出跟先進先出你該有印象了吧?還沒印象的話那我這流氓式教育還真是失敗

     棧和隊列可以是使用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;      }  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.