1. 两个栈实现栈
1.这里使用的是ArrayDequeue, 而不是使用Stack,因为Stack 集合是在Java Collection Framework被淘汰的集合。
2. 这里push操作增加的元素放在stack1中;
3. 这里pop操作作用集合为stack2, 如果stack2为空,则将stack1中元素push到stack2中,然后再stack2进行pop()操作。
package com.fqyuan.thought;
import java.util.ArrayDeque;
public class QueueWithStack {
private ArrayDeque<Integer> stack1 = new ArrayDeque<>();
private ArrayDeque<Integer> stack2 = new ArrayDeque<>();
// 1. choose a stack to insert into.
public void enqueue(int item) {
stack1.push(item);
}
// 2. if stack2 is empty, move elements of stack1 into stack2, then pop
// stack2.
public int dequeue() {
if (stack2.isEmpty())
while (!stack1.isEmpty())
stack2.push(stack1.pop());
return stack2.pop();
}
}
2. 两个队列实现栈
- 由于Queue是接口类型,所以这里在新建Queue对象时需要new具体实现了Queue接口的类, 这里选择了LinkedList。
- 实现时保证,其中一个队列为空,所以在push和pop操作时要满足不同要求。
- push操作向非空的队列中push;pop操作时将非空的队列中的size()-1个元素移到另一个队列,然后弹出最后一个元素即可。
package com.fqyuan.thought;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
public class StackWithQueue {
private Queue<Integer> queue1 = new LinkedList<>();
private Queue<Integer> queue2 = new LinkedList<>();
// 1. 往非空的队列中放元素
public void push(int item) {
if (queue1.isEmpty())
queue2.offer(item);
else
queue1.offer(item);
}
// 2. 始终有一个队列为空,现将一个队列元素(n-1)个移动到另一个队列,然后将最后一个元素弹出。
public int pop() {
if (isEmpty())
return -1;
if (queue1.isEmpty()) {
while (queue2.size() > 1)
queue1.offer(queue2.poll());
return queue2.poll();
} else {
while (queue1.size() > 1)
queue2.offer(queue1.poll());
return queue1.poll();
}
}
public int top() {
if (queue1.isEmpty()) {
while (queue2.size() > 1)
queue1.offer(queue2.poll());
int item = queue2.poll();
queue1.offer(item);
return item;
} else {
while (queue1.size() > 1)
queue2.offer(queue1.poll());
int item = queue1.poll();
queue2.offer(item);
return item;
}
}
public boolean isEmpty() {
return queue1.isEmpty() && queue2.isEmpty();
}
}