我们在面试的时候经常会遇到要求用两个栈实现一个队列,此篇文章直接搞定两个队列实现一个队列
public class TwoStackImplQueue {
Stack stack1 = new Stack();
Stack stack2 = new Stack();
//模拟队列的入队
public void push(Integer value){
//新添加的数据都放进第一个栈
stack1.push(value);
}
//模拟队列的出队
public Integer pop() throws Exception {
//判断栈2是否为空,如果为空就去遍历栈1中的数据,把栈1中的数据依次放入栈2
if(stack2.size()==0){
//把栈1的数据拿光,栈1最底下的数据(最先进的数据),最后一个拿出,放在栈2的顶部(最先拿到),这不就是队列嘛
while(stack1.size()>0){
Integer top = stack1.pop();
stack2.push(top);
}
//当拿光栈1的数据,栈2还是为空,只能说明栈确实空了
if(stack2.size()==0){
throw new Exception("queue is empty");
}
}
//栈2不为空或栈1拿光放到栈2后,从栈2顶部拿值
return stack2.pop();
}
public static void main(String[] args) throws Exception {
TwoStackImplQueue twoStackImplQueue = new TwoStackImplQueue();
twoStackImplQueue.push(222);
twoStackImplQueue.push(2);
twoStackImplQueue.push(999);
System.out.println(twoStackImplQueue.pop());
}
}
第一个栈只负责添加元素,第二个栈在弹出元素时,首先判断当前栈是否为空,若为空就直接将其第一个栈中的数据全部压入第二个栈中,然后输出栈顶元素,即可实现队列效果;若第二个栈中有数据,添加直接将其数据压入第一个栈中,输出时直接输出第二个栈顶的元素即可!



