使用两个栈实现一个队列
题目:请使用两个栈实现一个队列,队列声明如下:请实现它的两个函数appendTail(队列尾部插入节点)和deleteHead(移除队列头部节点)。
考察点:
主要考察栈和队列的理解,以及通过画图把抽象的问题形象化。
分析思路:
队列的特性:先进先出
栈的特性:先进后出
如图所示,用两个栈实现的队列,元素会先压入第一个栈,当需要移除元素时,我们再把第一个栈的元素弹出,压入第二个栈,再弹出,进而达到了我们使用两个栈实现一个队列的目的,上代码。
+---+ +---+
| 3 | | 1 |
+---+ +---+
| 2 | | 2 |
+---+ +---+
| 1 | | 3 |
+---+ +---+
Stack-input Stack-out
代码如下:
import java.util.Stack;
//使用泛型
public class MyQueue<T> {
//输入栈-注意命名规范
private Stack<T> inputStack;
//输出栈
private Stack<T> outStack;
//添加构造函数,便于测试
public MyQueue(Stack inputStack, Stack outStack) {
this.inputStack = inputStack;
this.outStack = outStack;
}
//尾部添加元素
public void appendTail(T element) {
inputStack.push(element);
}
//移除头部元素
public T deleteHead() {
//如果第二个栈为空,则将第一个栈的栈顶元素不断的压入第二个栈
if(outStack.empty()){
while(!inputStack.empty()) {
outStack.push(inputStack.pop());
}
}
//如果此时第二个输出栈依旧为空,则代表两个栈均为空,没有元素
if(outStack.empty()){
System.out.println("MyQueue is empty");
return null;
}
return outStack.pop();
}
//测试用例
public static void main(String[] args) {
Stack inputStack = new Stack();
Stack outStack = new Stack();
//泛型 使用String -Integer 来测试
MyQueue<String> stringQueue = new MyQueue(inputStack,outStack);
stringQueue.appendTail("a");
stringQueue.appendTail("b");
stringQueue.appendTail("c");
System.out.println(stringQueue.deleteHead());
System.out.println(stringQueue.deleteHead());
stringQueue.appendTail("d");
System.out.println(stringQueue.deleteHead());
System.out.println(stringQueue.deleteHead());
System.out.println(stringQueue.deleteHead());
MyQueue<Integer> integerQueue = new MyQueue(inputStack,outStack);
integerQueue.appendTail(1);
integerQueue.appendTail(2);
integerQueue.appendTail(3);
System.out.println(integerQueue.deleteHead());
System.out.println(integerQueue.deleteHead());
integerQueue.appendTail(4);
System.out.println(integerQueue.deleteHead());
System.out.println(integerQueue.deleteHead());
System.out.println(integerQueue.deleteHead());
}
}