JavaShowAlgorithm-使用2个栈实现队列

来源:互联网 发布:海森伯格矩阵图片 编辑:程序博客网 时间:2024/05/16 10:36

思路一:

我们设定s1是入栈的,s2是出栈的。


入队列,直接压到s1即可


出队列,先把s1中的元素倒入到s2中,弹出s2中的栈顶元素;再把s2的剩余元素全部倒回s1中。


wKioL1cMpjajUzcyAABT0frZ3KM694.png

缺点:

每次只要出栈一个元素就要将元素倒来倒去,麻烦!!!


思路2:
入队列时:
如果s1为空,把s2中所有的元素倒出压到s1中。否则直接压入s1   

出队列时:
如果s2不为空,把s2中的栈顶元素直接弹出。否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素


wKiom1cMppLwMd0QAAB3LagChFk387.png



思路1无条件地每次都要将元素倒来倒去,思路2出队时较思路1简单。


思路3:

我们设定s1是入栈的,s2是出栈的

入队列:直接压入元素至s1即可

出队列:如果s2不为空,把s2中的栈顶元素直接弹出。否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素


wKioL1cMp8HR1m6aAABLlSxXUHE848.png


相比于方法2,入队直接压入即可~

那么,我们可以看出,思路三最简单,我们下面看下代码。


第三种方法最为优秀,实现该方法如下:

public class Stack2Queue {private Stack stack1;private Stack stack2;private int maxLength;public Stack2Queue(int capacity) {maxLength = capacity;stack1 = new Stack(capacity);stack2 = new Stack(capacity);}public boolean put(int item) {if (stack1.isFull() || maxLength == size()) {// 满了return false;}stack1.push(item);return true;}public int poll() {if (!stack2.isEmpty()) {return stack2.pop();} else {while (!stack1.isEmpty()) {stack2.push(stack1.pop());}return stack2.pop();}}public int size() {return stack1.size() + stack2.size();}}