11. 用两个栈实现一个队列
问题描述:
用两个栈实现一个队列。队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能。其中队列的声明如下,请自行补充appendTail()
和deleteHead()
函数
public class Queue<T> {
private Stack<T> stack1 = new Stack<T>();
private Stack<T> stack2 = new Stack<T>();
public void appendTail(T data) {
stack1.push(data);
}
public T deleteHead() {
// .....
}
}
分析:
- 队列是先进先出
- 栈是先进后出
- 我们需要拿两个先进后出的栈,来实现一个先进先出的队列。
- 我们假设要插入一个元素a,假设我们把a插入到
stack1
中,此时stack = {a}, stack2 = null
, - 我们继续插入元素 b、c ,还是插入到
stack1
, 此时stack = {a, b, c}, stack2 = null}
- 假设我们现在需要删除一个元素,按照队列的特性 我们需要删除的是 a 这个元素,如果我们直接操作
stack1
这个栈,是无法做到的,那该怎么办呢? - 此时我们就可以借助
stack2
来实现了,我们将stack1
中的所有元素,全部移入到stack2
中,此时stack1 = null, stack={c,b,a}
stack2中的序列不就是我们的队列的序吗?我们从stack中取数据就好了 - 之后,如果我们需要appen的话,就直接append到
stack1
中,我们需要delete的话,直接从stack2
中取就行了,当stack2
为空的话,就将stack1
中的数据移入到stack2
中,当stack1
为空的话,没有数据移入到stack2
的话就,移入空,当stack1 = stack2 = null
的时候,就说明 队列为空了。
代码如下:
import java.util.Stack;
/**
* Class day11 ...
*
* @author LiJun
* Created on 2018/12/26
*/
public class Queue<T> {
private Stack<T> stack1 = new Stack<T>();
private Stack<T> stack2 = new Stack<T>();
public void appendTail(T data) {
stack1.push(data);
}
public T deleteHead() {
if (stack2.empty()) {
while (!stack1.empty()) {
stack2.push(stack1.pop());
}
}
if (stack2.empty()) {
return null;
}
return stack2.pop();
}
@Override
public String toString() {
return "\nQueue{" +
"stack1=" + stack1 +
", stack2=" + stack2 +
'}';
}
public static void main(String[] args) {
Queue<Integer> queue = new Queue<>();
// 依次向队列插入 1 2 3 4 数据 并打印当前队列信息
queue.appendTail(1);
queue.appendTail(2);
queue.appendTail(3);
queue.appendTail(4);
System.out.print(queue);
// 移出并打印队列两个元素 打印队列
System.out.print(queue.deleteHead() + " ");
System.out.print(queue.deleteHead() + " ");
System.out.print(queue);
// 向队列append 元素 5 6 并打印队列
queue.appendTail(5);
queue.appendTail(6);
System.out.print(queue);
// 移除队列
System.out.print(queue.deleteHead() + " ");
System.out.print(queue.deleteHead() + " ");
System.out.print(queue.deleteHead() + " ");
System.out.print(queue.deleteHead() + " ");
System.out.println(queue);
System.out.print(queue.deleteHead() + " ");
System.out.print(queue.deleteHead() + " ");
System.out.print(queue);
System.out.print(queue);
}
}
// 为了方便查看,我就重写了toString函数