兩個棧實現一個隊列,兩個隊列實現一個棧


1、兩個棧實現一個隊列

有三種思路:

思路一:將stack1作為存儲空間,將stack2作為臨時緩沖區,入隊時,直接壓入stac1,出隊時,將stack1中的元素依次出棧壓入stack2中,再將stack2的棧頂元素彈出,最后將stack2中的元素再倒回給stack1

思路二:入隊時,判斷stack1是否為空,如果stack1為空,則將stack2中的所有元素都倒入stack1中,再將元素直接壓入stack1,否則,直接壓入stack1中  

           出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,在將stack2的棧頂元素彈出,否則,直接彈出stack2的棧頂元素

思路三:入隊時,直接壓入stack1中

           出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,否則直接彈出stack2中的元素

思路一與思路二相比,如果是連續出棧操作或連續進棧操作,思路二比思路一好很多。思路三最好代碼如下。

 1 //入隊操作
 2 void EnQueue(stack<int> &s1,stack<int> &s2,int m)
 3 {
 4     s1.push(m);
 5 }
 6 
 7 //出隊操作
 8 void DeQueue(stack<int> &s1,stack<int> &s2,int &m)
 9 {
10     if (s2.empty())
11     {
12         int p = s1.size();
13         for (int i=0;i<p;i++)
14         {
15             s2.push(s1.top());
16             s1.pop();
17         }    
18     }
19     m = s2.top();
20     s2.pop();
21 }

2、兩個隊列實現一個棧

 將queue1用作進棧出棧,queue2作為一個中轉站

入棧時,直接壓入queue1中

出棧時,先將queue1中的元素除最后一個元素外依次出隊列,並壓入隊列queue2中,將留在queue1中的最后一個元素出隊列即為出棧元素,最后還要把queue2中的元素再次壓入queue1中

實現代碼如下:

 1 //進棧操作
 2 void stackpush(queue<int> &q1,queue<int> &q2,int m)
 3 {
 4     q1.push(m);
 5 }
 6 
 7 //出棧操作
 8 void stackpop(queue<int> &q1,queue<int> &q2,int &m)
 9 {
10     int p = q1.size();
11     for (int i=0;i<p-1;i++)
12     {
13         q2.push(q1.front());
14         q1.pop();
15     }
16     m = q1.front();
17     q1.pop();
18     int l = q2.size();
19     for (int j = 0;j<l;j++)
20     {
21         q1.push(q2.front());
22         q2.pop();
23     }
24 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM