剑指 Offer - 05 - 用两个栈实现一个队列
题目
用两个栈来实现一个队列,完成队列的 Push
和 Pop
操作。 队列中的元素为 int
类型。
解析
这题也比较简单。两种思路:
思路一:
push
的时候直接放到stack1
;- 为了
pop
的操作,当stack2
空(必须当stack2
为空) 的时候,一次性(必须一次性) 要将stack1
的全部push
到stack2
中; - 然后
pop()
的时候,取的就是stack2
的栈顶;
看个例子:
代码:
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public int pop() {
if (stack1.isEmpty() && stack2.isEmpty())
throw new RuntimeException("Queue is empty!");
if (stack2.isEmpty()) { //如果 stack2 不空的话,就先不要将 stack1 的内容放进去
while (!stack1.isEmpty())
stack2.push(stack1.pop());
}
return stack2.pop();
}
}
思路二:
- 每次从队列中取队头元素的时候,都是取
stack2.pop()
(栈顶),每次push
都是push
到stack1
; - 当
push
的时候,如果stack2
不空,就要将stack2
的全部倒入stack1
中;然后再push
新元素; - 当
pop()
取元素的时候,如果stack1
不空,就要先全部倒入stack2
,因为stack1
最下面的是最早进来的,所以要最先出去,利用stack2
倒转一下;
看个例子就懂了:
代码:
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
while (!stack2.isEmpty())
stack1.push(stack2.pop());
stack1.push(node);
}
public int pop() {
if (stack1.isEmpty() && stack2.isEmpty())
throw new RuntimeException("Queue is Empty!");
while (!stack1.isEmpty())
stack2.push(stack1.pop());
return stack2.pop();
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论