栈的特性:先进后出(FILO); 队列的特性:先进先出(FIFO)
1、两个栈实现一个队列
(1)思路:入栈时,直接压入栈1中;如果栈1满了,判断栈2是否为空,若为空,则将栈1元素全部倒入栈2,再入栈;若栈2不为空,则不能再入元素;
出栈时,判断栈2是否为空,若栈为空,则将栈1中的元素倒入栈2,否则直接弹出栈2中的元素;
(2)代码实现:
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());//依次将栈1中的元素放入栈2
16 s1.pop();
17 }
18 }
19 m = s2.top(); //获取栈2顶部元素
20 s2.pop();
21 }
2、两个队列实现一个栈
(1)思路:将queue1用作进栈出栈,queue2作为一个中转站;
入栈时,直接压入queue1;
出栈时,先将queue1中的元素除最后一个元素依次出队列,并压入queue2中,将留在queue1中的最后一个元素出 队列即为出栈元素,最后还要把queue2中的元素再次压入queue1中;
//进栈操作
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 }