题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
题目分析
三种实现思路:
- 一直以stack2为队列,栈顶为队头,栈底为队尾。这种情况下,pop操作可以直接把stack2的栈顶元素返回就行,但是push操作就需要stack1的辅助了,即先把stack2的元素转移到stack1,这时候stack2的栈顶(队头)就是stack1的栈底,stack2的栈底(队尾)就是stack1的栈顶。push的元素加到stack1的栈顶,然后再把stack1的所有元素转移到stack2。这种实现方式就比较适合pop频率大于push频率的情况。
- 一直以stack1为队列,栈顶为队尾,栈底为队头。这种情况下,push操作可以直接把元素加到stack1的栈顶,但是pop操作就需要stack2的辅助了,即先把stack1的元素转移到stack2,这时候stack1的栈顶(队尾)就是stack1的栈底,stack1的栈底(队头)就是stack1的栈顶。pop的stack2的栈顶,然后再把stack2的所有元素转移到stack1。这种实现方式就比较适合push频率大于pop频率的情况。
- 前面两者的折衷。stack1的栈底是队头,栈顶是队尾。stack2的栈底是队尾,栈顶是队头。但是在执行完一次pop或者push操作后,并不是固定地将元素转移到固定的stack,也就是说,不会一直以某个stack为队列。而是等待下一个指令,如果和前面的是一样的,比如上次是push这次也是push,那就直接进行操作,不用转移。这种实现方式适合连续push或者连续pop的情况。
代码实现
第一种
class Solution
{
public:
void push(int node) {
while(!stack2.empty()){
stack1.push(stack2.top());
stack2.pop();
}
stack1.push(node);
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
}
int pop() {
int the_top=stack2.top();
stack2.pop();
return the_top;
}
private:
stack<int> stack1;
stack<int> stack2;
};
第二种
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
int the_top=stack2.top();
stack2.pop();
while(!stack2.empty()){
stack1.push(stack2.top());
stack2.pop();
}
return the_top;
}
private:
stack<int> stack1;
stack<int> stack2;
};
第三种
class Solution
{
public:
void push(int node) {
while(!stack2.empty()){
stack1.push(stack2.top());
stack2.pop();
}
stack1.push(node);
}
int pop() {
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
int the_top=stack2.top();
stack2.pop();
return the_top;
}
private:
stack<int> stack1;
stack<int> stack2;
};