题目:用两个栈实现一个队列,只要求实现入队,出队方法即可.
假设这两个栈分别为s1,s2
- 分析思路
1、栈的特性为:先进后出;队列的特性为:先进先出;
2、如一个数组data[0] ~ data[n - 1]
,我们将它压入s1
栈中,那么data[0]
在栈底,data[n - 1]
在栈顶;
3、如果我们对s1
栈中的元素执行出栈操作,并将出栈元素压入s2
栈中,那么在s2
栈中data[n - 1]
在栈底,data[0]
在栈顶;
4、此时s2
栈中的元素再次出栈的话,顺序即是:按照data[0] ~ data[n - 1]
的顺序进行出栈,这就和队列先进先出的顺序相吻合. - 实现思路1
1、把s1
作为存储空间,s2
作为临时空间;
2、入栈时:把元素压入s1
;
3、出栈时:把s1
中除栈底元素外的所有元素都倒入s2
,弹出s1
的栈底元素,然后把s2
中所有元素倒回s1
. - 实现思路2
1、把s1
作为存储空间,s2
作为临时空间;
2、入栈时,判断s1
是否为空:
如不为空,说明所有元素都在s1
,直接将入栈元素压入s1
;
如为空,将s2
中的所有元素倒回s1
,再将入栈元素压入s1
;
3、出栈时,判断s2
是否为空:
如不为空,直接弹出s2
的栈顶元素并出栈;
如为空,把s1
中除栈底元素外的所有元素都倒入s2
,然后弹出s1
的栈底元素. - 实现思路3 - 最佳方案
1、把s1
作为存储空间,s2
作为临时空间:
2、入栈时,将元素压入s1
;
3、出栈时,判断s2
是否为空:
如不为空,则直接弹出顶元素;
如为空,把s1
中除栈底元素外的所有元素都倒入s2
,然后弹出s1
的栈底元素.
最佳方案实现代码:
class Stack4Queue<E> {
private Stack<E> s1 = new Stack<>();
private Stack<E> s2 = new Stack<>();
// 入队列
public void push(E item) {
s1.push(item);
}
// 出队列
public E pop() {
if (s2.empty()) {
if (s1.empty()) {
return null;
}
while (s1.size() != 1) {
s2.push(s1.pop());
}
return s1.pop();
}
return s2.pop();
}
}
网友评论