题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路:利用栈的先进后出和队的先进先出实现。
1.java版比较简单,直接实现
思路:s2为空时,s1入栈,s1出栈时,先出栈到s2,s1为空,再弹出s2的顶部元素,这样再入栈时,先将s2出栈直到s2为空,再入栈,这样其实比较浪费空间,后面c++实现部分,由一个不浪费空间的方法。
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
while(!stack2.empty())
{
stack1.push(stack2.pop());
}
stack1.push(node);
}
public int pop() {
while(!stack1.empty())
{
stack2.push(stack1.pop());
}
return stack2.pop();
}
}
2.c++版实现
思路:和java版的思路一样,重点想强调的是,java中stack.pop()的意思是:返回栈顶元素并弹出。这样在c++中必须用三句话实现:将栈顶赋给临时元素,将栈顶弹出,再返回临时变量。要是写成两句话:return栈顶,后面的pop()能起作用才怪了呢!
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 tmp=stack2.top();
stack2.pop();
return tmp;
}
private:
stack<int> stack1;
stack<int> stack2;
};
3.c++版实现(2)
上面不是说了比较浪费空间嘛,现在的想法就是s1直接入栈,但是出栈稍微麻烦一些,首先判断s2是否为空,如果为空,那么按照原来的方式出栈,如果不为空,先出栈s2的栈顶,这样push函数实现比较简单,不需要来回折腾了。不过:出栈还是要三句话实现,要不,找bug找半天。
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
int tmp;
if(stack2.empty())
{
while(!stack1.empty())
{
tmp=stack1.top();
stack2.push(tmp);
stack1.pop();
}
}
tmp=stack2.top();
stack2.pop();
return tmp;
}
private:
stack<int> stack1;
stack<int> stack2;
};