剑指offer【面试题07:用两个栈实现队列】

//题目描述
//用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

思路:必须知道,stack<> 是先进后出的,queue<>是先进先出的; 所以按照题目要求,例如:我们按次序将1、2、3、4、5分别push进stack中,我们希望得到如图:

这样就达到了题目要求:先进先出。但是现在问题是一个stack无法满足如图需求。我们考虑将1234已经压入stack1,并且满足”先进先出”。现在准备加入5;流程如下图:

 1 //题目描述
 2 //用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
 3 #include<iostream>
 4 #include<stack>
 5 
 6 using namespace std;
 7 
 8 stack<int> stack1;
 9 stack<int> stack2;
10 // |------------
11 // | 2 3 1 3 5 0
12 // |------------
13 void push(int node)
14 {
15     //<1> 将stack1的元素备份到 stack2
16     const int stack1_size = stack1.size(); 
17     for (int i = 0; i < stack1_size; i++)
18     {
19         int temp = stack1.top();
20         stack1.pop();
21         stack2.push(temp);
22     }
23     stack1.push(node); // push 操作
24     // <2> 从stack2恢复元素
25     const int stack2_size = stack2.size();
26     for (int m = 0; m < stack2_size; m++)
27     {
28         int temp = stack2.top();
29         stack2.pop();//这里顺便把stack2清空了
30         stack1.push(temp);
31     }
32 }
33 
34 int pop() {
35     int temp = stack1.top();
36     stack1.pop();
37     return temp;
38 }
39 
40 int main()
41 {
42     push(1);
43     push(2);
44     push(3);
45     push(4);
46     push(5);
47 
48     cout << pop() << endl; //1
49     cout << pop() << endl; //2
50     cout << pop() << endl; //3
51     cout << pop() << endl; //4
52     cout << pop() << endl; //5
53     return 1;
54 }
原文地址:https://www.cnblogs.com/winslam/p/9473797.html