两个栈实现一个队列,两个队列实现一个栈
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 }