1 用栈实现队列
首先我们先回顾一下栈的队列的基本特征,栈:先进后出;队列:先进先出。那么如何将他们相互转换呢?
LeetCode232和225有两题,分别是用栈实现队列和用队列实现栈。
232题目如下
由于栈是先进后出,当我们把一组数字,连续进入两次栈内会发生什么,假设第一个数,第一遍先进后出,第二遍后进先出。 那么最后这个数字就是最先出来的,也是最先进来的。和队列里是一样的,先进先出。
所以我们思路已有,将一组数进入两次栈内,出栈顺序就和第一遍栈顺序一样。我们也就可以设置两个堆栈,一个赋值进栈的instack,一个负责出栈的outstack,我们将instack弹出outstack,然后outstack出栈就是想要的结果了。
这里入栈的话,就进到instack就好了,出栈的话就outstack弹栈就OK,那么这里什么时候将instack的元素送到outstack里呢?我们肯定不能instack进一个数,就送到outstack,这样的话,还是先进后出。我们要在出栈的时候,且outstack里是空的时候,将instack里的outstack里。
代码如下:
class MyQueue {
Deque<Integer> inStack;
Deque<Integer> outStack;
public MyQueue() {
inStack = new LinkedList<Integer>();
outStack = new LinkedList<Integer>();
}
public void push(int x) {
inStack.push(x);
}
public int pop() {
if (outStack.isEmpty()) {
in2out();
}
return outStack.pop();
}
public int peek() {
if (outStack.isEmpty()) {
in2out();
}
return outStack.peek();
}
public boolean empty() {
return inStack.isEmpty() && outStack.isEmpty();
}
private void in2out() {
while (!inStack.isEmpty()) {
outStack.push(inStack.pop());
}
}
}
2 用队列实现栈
这个相对简单一点。由于栈是后进先出,所以当我们用队列先进先出实现时候,我们设置两个队列,一个负责保存入队元素之前的元素集放入队头q1,另一个队负责将该入队元素到队尾q2,这样刚入队的元素就可以最先出队,实现后进先出。进栈元素入队q2后,将另一对列q1的元素全部入队到q2中,然后q1和q2对列互换,方便下次使用
代码如下:
class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack() {
queue1 = new LinkedList<Integer>();
queue2 = new LinkedList<Integer>();
}
public void push(int x) {
queue2.offer(x);
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());
}
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public int pop() {
return queue1.poll();
}
public int top() {
return queue1.peek();
}
public boolean empty() {
return queue1.isEmpty();
}
}