两个栈实现队列
队列每次只能删除头,只能在末尾添加,“先进先出”原则
栈“先进后出”
package queue;
import java.util.Stack;
//用“栈”实现队列
public class QueueTest<T> {
// 向队列添加数据时:(01) 将“已有的全部数据”都移到mIn中。 (02) 将“新添加的数据”添加到mIn中。
private Stack<T> mIn = null;
// 从队列获取元素时:(01) 将“已有的全部数据”都移到mOut中。(02) 返回并删除mOut栈顶元素。
private Stack<T> mOut = null;
private int mCount = 0;
public QueueTest() {
mIn = new Stack<T>();
mOut = new Stack<T>();
mCount = 0;
}
private void add(T t) {
// 将“已有的全部数据”都移到mIn中
while (!mOut.empty())
mIn.push(mOut.pop());
// 将“新添加的数据”添加到mIn中
mIn.push(t);
mCount++;
}
private T get() {
// 将“已有的全部数据”都移到mOut中
while (!mIn.empty())
mOut.push(mIn.pop());
mCount--;
return mOut.pop();
}
private boolean isEmpty() {
return mCount == 0;
}
//测试
public static void main(String[] args) {
QueueTest list = new QueueTest();
list.add(10);
list.add(20);
list.add(30);
while(!list.isEmpty()){
System.out.println(list.get());
}
}
}
两个队列实现栈
package stack;
import java.util.ArrayDeque;
import java.util.Queue;
public class StackTest {
Queue<Integer> queue1 = new ArrayDeque<>();
Queue<Integer> queue2 = new ArrayDeque<>();
public void push(Integer node) {
// 两个队列都为空时,优先考虑queue1
queue1.add(node);
}
public int pop() {
// 两个栈都为空时,没有元素可以弹出
if (queue1.isEmpty() && queue2.isEmpty()) {
try {
throw new Exception("stack is empty");
} catch (Exception e) {
}
}
// 如果queue1为空,queue2有元素, 将queue2的元素依次放入queue1中,直到最后一个元素,我们弹出。
if (queue1.isEmpty()) {
while (queue2.size() > 1) {
queue1.add(queue2.poll());
}
return queue2.poll();
}
if (queue2.isEmpty()) {
while (queue1.size() > 1) {
queue2.add(queue1.poll());
}
return queue1.poll();
}
return (Integer) null;
}
public static void main(String[] args) {
StackTest s = new StackTest();
s.push(1);
s.push(2);
s.push(3);
s.push(4);
System.out.println(s.pop());
System.out.println(s.pop());
s.push(5);
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
}
}