如何使用栈模拟一个队列
队列先进先出。
栈先进后出。
最近看到一道面试题,要求用两个栈模拟一个队列,这个问题在一年前遇到过,记录一下。
使用栈模拟队列,一个肯定不行,首先想到用两个栈来模拟队列。
当队列有数据要入队时,我们同时将这个数据入栈A

此时我们认为,第一次向队列中插入数据完成了。则我们将A中的数据弹出,使用B来接收这些值。

就这样将A中的元素全部弹出并且压进B中,这时就会发现,他们顺序逆转,并且如同队列一样,先进的元素到了栈顶,可以先出。
我们让1出队之后,此时我们还想继续向队列中添加数据。

此时,2依然是栈B放在栈顶的元素。此时有新的元素加入,我们依然采取刚才的方法,在新数据入队时,插入数据到栈A中。
插入栈A之后,我们可以对栈B进行判断,如果栈B中还存有元素,则这名刚才添加的元素尚未全部出队,他们仍然遵守先进先出的原则。
当栈B中的元素全部弹出之后,我们就可以将栈A中的元素再次弹出并压进栈B,此时又实现了先进先出。
代码实现:
-
-
private Stack<Integer> stackB = new Stack<Integer>(); -
-
/** -
* 入队操作 -
* @param element 入队的元素 -
*/ -
public void enQueue(int element) { -
stackA.push(element); -
} -
-
/** -
* 出队操作 -
*/ -
public Integer deQueue() { -
if(stackB.isEmpty()){ -
if(stackA.isEmpty()){ -
return null; -
} -
transfer(); -
} -
return stackB.pop(); -
} -
``
-
``
-
/** -
* 栈A元素转移到栈B -
*/ -
private void transfer(){ -
while (!stackA.isEmpty()){ -
stackB.push(stackA.pop()); -
} -
} -
``
-
``
-
public static void main(String[] args) throws Exception { -
StackQueue stackQueue = new StackQueue(); -
stackQueue.enQueue(1); -
stackQueue.enQueue(2); -
stackQueue.enQueue(3); -
System.out.println(stackQueue.deQueue()); -
System.out.println(stackQueue.deQueue()); -
stackQueue.enQueue(4); -
System.out.println(stackQueue.deQueue()); -
System.out.println(stackQueue.deQueue()); -

浙公网安备 33010602011771号