1.1、用两个栈实现队列
题目来源:力扣网
题目: 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
解析:
class CQueue{
public CQueue(){
}
public void appendTail(int value){
}
public int deleteHead(){
}
}
栈是先进后出数据结构,单个栈无法获取栈底元素,但是可以使用另一个栈,两次反转,及正向,变成队列的先进先出结构。
对appendTail()入队来说,就只让A栈存储数据,对deleteHead() 出队来说,让B栈存储A栈的出栈数据:
数据在栈中的状态:
deleteHead()出队存在三种情况:
1、若B栈不为空(B栈还有上次没有输出完的数据),就优先输出B栈中的栈顶数据。 (我第一做的时候这个情况漏掉了- -)
2、若B栈为空,A栈不为空,就将A栈数据全部压入B栈,在输出B栈中的栈顶数据。
3、若B栈和A栈均为空,则依题意输出-1。
import java.util.Stack;
class CQueue{
private Stack<Integer> A;
private Stack<Integer> B;
public CQueue(){
A=new Stack<Integer>();
B=new Stack<Integer>();
}
public void appendTail(int value){
A.add(value);
}
public int deleteHead(){
if(!B.isEmpty()){
return B.pop();
}else if(A.isEmpty()){
return -1;
}
while(!A.isEmpty()){
B.add(A.pop());
}
return B.pop();
}
}