题目描述:
解法1:
这里使用两个LinkedList链表作为两个栈。思路很简单,我们用A栈作为主栈,B栈作为辅助栈。当元素添加时,把元素push到A栈中。然后删除元素时,按照题意,我们要删除的是栈底的元素,因为队是先进先出,但是使用pop方法只能删除栈顶元素。只时候,我们先判断A栈是否为空,A栈为空,则返回-1。A栈不为空,则while循环不断把A栈的元素pop出来,然后push到B栈中,此时B栈就相当于A栈的倒序。B栈的栈顶就是A栈的栈底。所以我们删除B栈栈顶,并返回值。同时将B栈元素重新pop出来,push到A栈即可。
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
class CQueue {
private LinkedList stackA;
private LinkedList stackB;
public CQueue() {
stackA = new LinkedList();
stackB = new LinkedList();
}
public void appendTail(int value) {
stackA.push(value);
}
public int deleteHead() {
if(stackA.isEmpty()) return -1;
while(!stackA.isEmpty()){
stackB.push(stackA.pop());
}
int num=(int)stackB.pop();
while(!stackB.isEmpty()){
stackA.push(stackB.pop());
}
return num;
}
}
解法2:
上面的解法,可以看到运行时间很长,这是因为我们不仅从A栈中取出元素给B栈,同时删除后将B栈元素又重新赋予A栈,使用了两个while循环当然速度慢。所以我们优化一下删除元素的方法,使用一个while循环,去除了把B栈放回A栈的操作。不放回A栈,不会造成影响吗?当然不会。首先,每次删除元素的时候,我们首先要判断B栈是否为空。不为空,证明B栈还有之前的元素没有删除,根据先进先出,继续删除栈顶元素即可。为空,则判断A栈是否还有元素,A栈没有元素,则返回-1。有元素,则把A栈元素继续pop出来,push到B栈删除即可。
那这样,B栈中有元素的情况下,我往A栈又添加元素,不会造成影响吗?不会的,根据先进先出的原则,B栈有元素,则说明这些这些元素先进,当然要先删除。当B栈的这些元素删除了,为空后,又会返回到把A栈元素放回到B栈的循环中。这样就可以减少每次删除后把B栈元素重新放回A栈的冗余操作。
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
class CQueue {
private LinkedList stackA;
private LinkedList stackB;
public CQueue() {
stackA = new LinkedList();
stackB = new LinkedList();
}
public void appendTail(int value) {
stackA.push(value);
}
public int deleteHead() {
if (stackB.isEmpty()) {
if (stackA.isEmpty()) return -1;
while (!stackA.isEmpty()) {
stackB.push(stackA.pop());
}
return (int)stackB.pop();
} else return (int)stackB.pop();
}
}