java实现“用两个栈实现队列”
使用两个栈实现队列,并提供一个队列尾部插入节点和队列头部删除节点方法。
两个栈,一个栈作为入列栈inputStack,一个栈作为出列栈outputStack。
对于入列操作,直接将元素push到inputStack中。
对于出列操作,
outputStack存在元素时,outputStack直接pop;
outputStack为空时,检查inputStack是否为空,inputStack不为空则将inputStack元素复制到outputStack,复制完成,outputStack首元素出列。inputStack为空,则抛出错误。
public class QueueByTwoStacks {
/**
* inputStack为入列栈,outputStack为出列栈
*/
private static Stack<Integer> inputStack = new Stack<>();
private static Stack<Integer> outputStack = new Stack<>();
/**
* 队列尾部插入节点
* @param item 插入值
* @return 返回插入的值
*/
public static Integer appendTail(int item){
return inputStack.push(item);
}
/**
* 队列头部删除节点
* @return 返回删除的节点值
*/
public static Integer deleteHead(){
//队列没有元素,抛出异常
if (size() == 0){
throw new IndexOutOfBoundsException("Queue is empty");
}
//出列栈为空,入列栈不为空,将入列栈所有元素复制到出列栈,并将入列栈元素清空,返回出列栈首元素
if (outputStack.empty()){
copy(outputStack,inputStack);
}
//出列栈不为空,返回首元素
return outputStack.pop();
}
private static int size(){
return inputStack.size()+outputStack.size();
}
/**
* 将入列栈的元素复制到出列栈,并将入列栈元素清空
* @param dest 出列栈
* @param src 入列栈
*/
private static void copy(Stack<Integer> dest,Stack<Integer> src){
while (!src.empty()){
dest.push(src.pop());
}
}
public static void main(String[] args) {
for (int i = 0;i<5;i++){
appendTail(i);
}
System.out.println(deleteHead());
System.out.println(deleteHead());
System.out.println(deleteHead());
appendTail(11);
appendTail(12);
System.out.println("-------遍历输出-----");
while (size() > 0){
System.out.println(deleteHead());
}
}
}
0
1
2
-------遍历输出-----
3
4
11
12