两个栈实现队列。
分析:队列是先进先出,栈是先进后出。
先无论怎样实现都需要将数据先存储起来,所以对一个栈进行压栈
出栈或者说出队列的实现,先进先出就必须将栈存储的数据倒过来才能通过栈实现,那么很明显要将stack1的数据弹栈到stack2中实现数据倒置
倒置弹栈很容易就是实现了数据的先进先出,但是我们需要考虑到数据事先存不存在以及两个栈空栈情况。
1)stack1空栈,stack2空栈 ,那么说明没有数据,队列没有数据。可返回-1
2)stack1有数据,stack2空栈(要么之前的数据出完,要么是第一次调用出列方法),这种情况就将stack1 的所有数据转移到stack2,对stack2进行弹栈就实现了出队列
3)stack1有数据,stack2也有数据(说明上次的出队列stack1的数据全部转移到2中没有出完),那么为了实现先入先出,就必须将他们出完,那么就直接弹栈stack2实现出队列
4)stack1无数据,stack2有数据,和第三种情况一样,直接弹栈出队列。
总而言之是要注意对栈空的判断。
队列进队列就直接对stack1压栈就实现了
队列出队列:首先考虑stack2的空栈情况,因为一旦stack2 存在数据,那么要实现先入先出就必须stack2弹栈完全;其次考虑stack1的空栈情况,它的直接影响是整个队列空的情况。
class CQueue {
private Stack<Integer> stack1;
private Stack<Integer> stack2;
public CQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
if (stack2.empty()){
if (stack1.empty()) return -1;
while(!stack1.empty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}
附带stack数据结构java的API