两个队列实现一个栈,要求实现push()和pop()方法
思路在每行代码的注释上:
代码实现
底层用了java.util.LinkedList的数据结构
package com.tangbaobao.offer;
import org.junit.jupiter.api.Test;
import java.util.LinkedList;
import java.util.Queue;
/**
* 两个队列实现栈
*
* @author 唐学俊
* @create 2018/04/03
**/
public class Test8_2 {
/**
* 初始化两个队列
*/
private Queue<String> queueA = new LinkedList<>();
private Queue<String> queueB = new LinkedList<>();
/**
* 入栈
*
* @param e
*/
public void push(String e) {
//如果两个队列都为空,则选择任意一个入队
if (queueA.isEmpty() && queueB.isEmpty()) {
queueA.add(e);
//否则选择一个非空的队列入队
} else if (queueA.isEmpty() && !queueB.isEmpty()) {
queueB.add(e);
} else {
queueA.add(e);
}
}
/**
* 出栈
*
* @return
*/
public String pop() {
//保证栈中元素不为空
if (queueA.isEmpty() && queueB.isEmpty()) {
try {
throw new Exception("栈中没有元素啦");
} catch (Exception e) {
e.printStackTrace();
}
} else {
//将非空的队列出队到空的队列中,只留下一个元素,然后将这个元素出对
if (!queueA.isEmpty()) {
while (queueA.size() > 1) {
queueB.add(queueA.poll());
}
return queueA.poll();
} else {
while (queueB.size() > 1) {
queueA.add(queueB.poll());
}
return queueB.poll();
}
}
return null;
}
@Test
public void fun1() {
this.push("a");
this.push("b");
this.push("c");
System.out.println(this.pop());
System.out.println(this.pop());
System.out.println(this.pop());
this.push("d");
System.out.println(this.pop());
}
}