剑指 Offer 09. 用两个栈实现队列
- 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除
- 思路:由于栈有先进后出的特征,所以若要实现队列的先进先出需要利用一个保存新元素的栈和一个准备输出旧元素的栈,旧元素的栈由前一个栈出栈得到。其中,删除元素时需要从保存旧元素的栈中取元素,取完后再从保存新元素的栈中填充。
//由于栈有先进后出的特征,所以若要实现先进先出需要实现进(add栈)、出(add栈)、进(del栈)、出(del栈)
//del栈负责删除元素,若del栈为空,需要查看add栈是否为空,将其元素出栈填充到del栈,实现以前的先进变成栈顶元素,实现先出
Stack<Integer> add = new Stack<>();//负责添加appendTail进来的元素和del栈为空仍需删除元素时出栈
Stack<Integer> del = new Stack<>();//负责实现deleteHead删除元素功能
public CQueue() {
}
public void appendTail(int value) {//实现入队功能
add.push(value);//add栈负责添加元素
}
public int deleteHead() {//实现出队功能
if (!del.isEmpty()) {//判断del栈是否为空,不为空,直接删除栈顶元素(以前add栈栈底元素)
return del.pop();
} else {
while (!add.isEmpty()) {//del栈填充能量
del.add(add.pop());
}
return del.isEmpty() ? -1 : del.pop();//三元选择符,若del最后为空,代表add栈也为空,返回-1
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
}