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 }