package class03;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
/**
* 用队列结构,实现栈结构
*/
public class Code07_TwoQueuesImplementStack {
/**
* 两个队列实现栈
*
* @param <T>
*/
public static class TwoQueueStack<T> {
public Queue<T> queue1;
public Queue<T> queue2;
public TwoQueueStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
//添加元素
public void push(T value) {
queue1.offer(value);//直接往queue1中添加元素
}
//弹出一个元素
public T poll() {
//保留queue1中最后一个元素,其余的元素全部弹出,放进queue2。
while (queue1.size() > 1) {
queue2.offer(queue1.poll());
}
T ans = queue1.poll();//将queue1中最后一个元素弹出
Queue<T> temp = queue1;//queue1中的所有元素和queue2中的所有元素交换
queue1 = queue2;
queue2 = temp;
return ans;//返回queue1中最后一个元素
}
//获取栈顶的值
public T peek() {
//保留queue1中最后一个元素,其余的元素全部弹出,放进queue2。
while (queue1.size() > 1) {
queue2.offer(queue1.poll());
}
T ans = queue1.poll();//将queue1中最后一个元素弹出
queue2.offer(ans);//再将这个元素,放进queue2中
//从queue1中弹出,再放进queue2中,就是为了不打乱"队形"。
//"队形"就是:每次取值时,保留queue1中最后一个元素,其余的元素全部弹出,放进queue2。queue1和queue2交换。
Queue<T> temp;//queue1中的所有元素和queue2中的所有元素交换
temp = queue1;
queue1 = queue2;
queue2 = temp;
return ans;//返回queue1中最后一个元素
}
public boolean isEmpty() {
return queue1.isEmpty();
}
}
public static void main(String[] args) {
TwoQueueStack<Integer> twoQueueStack = new TwoQueueStack<>();
Stack<Integer> test = new Stack<>();
int testTimes = 1000;
int maxValue = 100;
System.out.println("test start!");
for (int i = 0; i < testTimes; i++) {
if (twoQueueStack.isEmpty()) {
if (!test.isEmpty()) {
System.out.println("oops0!");
break;
}
int num = (int) (Math.random() * maxValue);
twoQueueStack.push(num);
test.push(num);
} else {
if (Math.random() < 0.25) {//四分之一概率比push方法
int num = (int) (Math.random() * maxValue);
twoQueueStack.push(num);
test.push(num);
} else if (Math.random() < 0.5) {//四分之一概率比peek方法
if (!twoQueueStack.peek().equals(test.peek())) {
System.out.println("oops1!");
}
} else if (Math.random() < 0.75) {//四分之一概率比poll方法
if (!twoQueueStack.poll().equals(test.pop())) {
System.out.println("oops2!");
}
} else {//四分之一概率比isEmpty方法
if (twoQueueStack.isEmpty() != test.isEmpty()) {
System.out.println("oops4!");
}
}
}
}
System.out.println("test end!");
}
}
![]()