没有输出的输入是不完整的

0%

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

本文为剑指 offer 系列第七篇。
目的就是用两个后进先出的栈来实现一个先进先出的队列,思路比较巧妙。

题目描述

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

解题思路

思路1

思路1比较朴素,我们用一个栈来作为数据存储的栈A,然后另一个作为中转的栈B,当我们存数据的时候,我们将数据压入到栈A中,然后取数据的时候,我们将A的所有数据都压入到B中,这个时候B的出栈顺序也就是队列应该的出队列顺序了,所以此时将B的栈顶元素取出即可,然后再将B中的所有的数据重新压回A中,后续操作皆是如此。

思路2

思路2其实是思路1的改进版,我们发现思路1在将数据取出之后,又把所有数据压回A栈,这样就会有很大的浪费,这里其实只要加一层判断,当往外取数据的时候,只要B栈不为空,就直接从B栈出栈栈顶元素即可,如果B栈为空,那么将A栈的数据全部压入到B栈中。从而省去中间多余的数据的来回压入操作。

解题代码

思路1代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution
{
public:
void push(int node) {
stack1.push(node);
}

int pop() {
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
int res = stack2.top();
stack2.pop();
while(!stack2.empty()){
stack1.push(stack2.top());
stack2.pop();
}
return res;
}

private:
stack<int> stack1;
stack<int> stack2;
};

时间复杂度为O(n^2),空间复杂度为O(n)

思路2代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution
{
public:
void push(int node) {
stack1.push(node);
}

int pop() {
if(stack2.empty()){
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
}
int res = stack2.top(); stack2.pop();
return res;
}

private:
stack<int> stack1;
stack<int> stack2;
};

时间复杂度为O(n),空间复杂度为O(n)
以上,本题结束!