题目:剑指 offer09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
栈的基本用法:
方法 | 功能 |
---|---|
Stack() | 构造一个空的栈 |
E push(E e) | 将e压入栈,并返回e |
E pop() | 弹出栈顶元素并返回 |
E peek() | 获取栈顶元素 |
int size() | 获取栈的大小 |
boolean isEmpty() | 判断栈是否为空 |
思路:
栈是先进后出的线性数据结构,只能对栈顶进行操作,所以在一个栈的情况下是无法实现删除队列头部,也就是栈底元素的。但是,在另一个栈的帮助下就可以实现了,如果需要删除栈底元素,就可以把a栈的元素一个一个弹出,压入b栈中,最后再把b栈中的栈顶元素弹出,然后实现删除a栈中的栈底元素。
java代码:
class CQueue {
/**
* 定义栈a和栈b
*/
Stack<Integer> a, b;
public CQueue() {
a = new Stack<>();
b = new Stack<>();
}
/**
* 在队列尾结点加入值,只需要将值压入栈中即可
*/
public void appendTail(int value) {
a.push(value);
}
/**
* 删除队列头元素,需要先将栈a的值弹出并存到栈b中,然后再弹出栈b的栈顶元素
* 注意: 当栈b不为空时,就算栈a压入新的元素栈b都不会加入新元素,会等栈b将所有元素弹出时,
* 才会重新压入新的元素,如果没有新元素压入,就会返回-1
*/
public int deleteHead() {
if (!b.isEmpty()) {
return b.pop();
}
if (a.isEmpty()) {
return -1;
}
while (!a.isEmpty()) {
b.push(a.pop());
}
return b.pop();
}
}