剑指offer6-用两个栈实现队列

一 题目描述

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

 

二 解法1

1 分析

  队列的特点是队尾进、队头出,先进先出的结构。而栈是栈顶入栈、栈顶出栈,先进后出的结构。所有用两个栈实现一个队列,那么这两个栈需分别存放入栈顺序队列元素,另一个栈存放相反顺序的队列元素。实现的关键是保持这两个栈内存放的元素相同,顺序相反

  入队操作:首先将新元素存放在stack1中,然后将stack2中元素依次弹出并入栈到stack1中知道stack2为空,接下来将新元素如空栈stack2,最后将原来stack2中的元素依次从stack1中弹出还原到stack2中。出队操作类似的:就是首先获取一下stack2的栈顶元素作为标记,然后将stack1元素全部存放到stack2中,在stack2中完成两次出栈操作。

  入队出队操作的复杂都为O(n)。

2 代码实现

 1 class Solution
 2 {
 3     
 4     /*思路:用stack1保存入队元素,stack2保存出队元素。入队、出队的复杂度都为O(n)的复杂度*/
 5     
 6 public:
 7     void push(int node) {
 8         //先将元素存入stack1中
 9         stack1.push(node);
10         //更新stack2中的数据,如果stack2不为空,先清空,再将stack1的元素先弹出再入stack2
11         int temp;
12         while (!stack2.empty()) {
13             temp = stack2.top();
14             stack1.push(temp);
15             stack2.pop();
16         }
17         //先将最新入队的元素入栈stack2
18         stack2.push(node);
19         //将原先栈stack2中的元素依次入栈
20         while (node != (temp = stack1.top())) {
21             stack2.push(temp);
22             stack1.pop();
23         }
24     }
25 
26     int pop() {
27         //如果stack2为空栈
28         
29         //如果stack2不为空,获取队尾元素
30         int ret = stack2.top();
31         //将stack1中所有元素入stack2中
32         int temp;
33         while (!stack1.empty()) {
34             temp = stack1.top();
35             stack1.pop();
36             stack2.push(temp);
37         }
38         //将除队尾元素外的其它元素入栈stack1
39         stack2.pop();
40         while (ret != (temp = stack2.top())) {
41             stack2.pop();
42             stack1.push(temp);
43         }
44         //将stack2中的队尾元素弹出
45         stack2.pop();
46         
47         return ret;
48     }
49 
50 private:
51     stack<int> stack1;
52     stack<int> stack2;
53 };

其实出队操作时要考虑stack2为空时的异常处理,但是在牛客网提交时一直报错。

1 if (stack1.empty())
2     throw exception("queue is empty.");

3 代码实现时的模糊点

 有关stack的操作。

 

该篇博客是自己的学习总结,水平有限,如有错误,欢迎讨论!

posted @ 2019-08-22 14:29  zpchya  阅读(136)  评论(0编辑  收藏  举报