题目:用两个栈实现一个队列,实现两个函数 appendTail 和 deleteHead,* 分别完成在队列尾部插入节点和在队列头部删除节点的功能
思路:in 栈用来处理 appendTail操作,out 栈用来处理 deleteHead操作。一个元素进入 in 栈之后,出栈的顺序被反转。当元素要出栈时,需要先进入 out 栈,此时元素出栈顺序再一次被反转,因此出栈顺序就和最开始入栈顺序是相同的,先进入的元素先退出,这就是队列的顺序。
代码实现:
/**
* 题目类型:栈
* <p>
* 题目要求:用两个栈实现一个队列,实现两个函数 appendTail 和 deleteHead,
* 分别完成在队列尾部插入节点和在队列头部删除节点的功能
* <p>
* <p>
* 思路:in 栈用来处理 appendTail操作,out 栈用来处理 deleteHead操作。一个元素进入 in 栈之后,出栈的顺序被反转。
* 当元素要出栈时,需要先进入 out 栈,此时元素出栈顺序再一次被反转,因此出栈顺序就和最开始入栈顺序是相同的,先进入的元素先退出,这就是队列的顺序。
*/
public class StackToQueue<T> {
// in 栈
private Stack<T> in = new Stack<>();
// out 栈
private Stack<T> out = new Stack<>();
// 在队列尾部插入节点
public void appendTail(T t) {
in.push(t);
}
// 在队列头部删除节点
public T deleteHead() throws Exception {
// 若 out 栈为空则将 in 栈中的所有数据弹出栈
if (out.isEmpty()) {
while (!in.isEmpty()) {
out.push(in.pop());
}
}
// 若 out 栈中无数据则抛出异常
if (out.isEmpty()) {
throw new Exception("queue is empty");
}
return out.pop();
}
@Test
public void testQueue() throws Exception {
StackToQueue<Integer> stackToQueue = new StackToQueue<>();
stackToQueue.appendTail(10);
stackToQueue.appendTail(20);
stackToQueue.appendTail(30);
System.out.println(stackToQueue.deleteHead());
System.out.println(stackToQueue.deleteHead());
System.out.println(stackToQueue.deleteHead());
}
}
复制代码