用两个栈实现队列
题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
中转栈
栈通过辅助栈反转就能形成一个队列。stack1作为主栈,stack2作为辅助栈,使用2个栈实现队列的核心概念是:每次操作前都要保证具有队列的特点,这样每次操作时将stack1元素全部转移到stack2中,新元素压入栈底,再将stack2中元素返回stack1中。
push算法:时间复杂度O(n)。
pop算法:时间复杂度O(1)。
class Solution
{
public:
void push(int node) {
while (!stack1.empty())
{
int tmp = stack1.top();
stack2.push(tmp);
stack1.pop();
}
stack1.push(node);
while (!stack2.empty())
{
int tmp = stack2.top();
stack1.push(tmp);
stack2.pop();
}
}
int pop() {
int tmp = stack1.top();
stack1.pop();
return tmp;
}
private:
stack<int> stack1;
stack<int> stack2;
};
优化栈
你会发现上一种算法有个问题就是每次入栈时,就要将栈反转一次,这是很多余的操作。如果我们在pop时再反转,反转的次数就会少很多,也就优化了很多。
- 当插入时,直接插入 stack1
- 当弹出时,当 stack2 不为空,弹出 stack2 栈顶元素,如果 stack2 为空,将 stack1 中的全部数逐个出栈入栈 stack2,再弹出 stack2 栈顶元素。
push算法:时间复杂度O(1)。
pop算法:时间复杂度O(n)。
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 tmp = stack2.top();
stack2.pop();
return tmp;
}
private:
stack<int> stack1;
stack<int> stack2;
};