小知识,大挑战!本文正在参与「程序员必备小知识」创作活动。
问题
用两个栈实现一个队列
使用两个先进后出的栈实现一个先进先出的队列
考察要点
队列的特点为FIFO, 即先进先出
栈的特点为FILO, 即先进后出
思路
我们要保证数据的有序性, 在入队列时, 应该是把数据放到同一个栈中的;
在出队列时, 也肯定是借助另一个栈进行数据的翻转的
假设我们向其中第一个栈中顺序放入数据1, 2, 3;
现在队列要进行出队操作, 我们只能把该栈中的数据依次出栈, 而这些数据依次进入第二个栈.
这样我们只需要对第二个栈进行出栈操作就是该队列的出队操作了
核心思路: 只要入队就将数据放入第一个栈中; 只要出队, 就从第二个栈中出栈; 如果第二个栈为空, 则将第一个栈中的数据出栈, 放到第二个栈中, 再进行第二个栈的出栈操作
代码
// 自定义队列
class MyQueue {
// 两个栈
private Stack stack1 = new Stack();
private Stack stack2 = new Stack();
// 入队操作
public void offer(int value) {
stack1.push(value);
}
// 出队操作
public int poll() throws Exception {
// 如果stack2为空, 则将stack1中的数据弹栈, 压入stack2中
if (stack2.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
// 最终stack2弹栈
return (int)stack2.pop();
}
}
总结
本题考察我们对于栈和队列的理解能力, 也同样考察我们的思维发散能力. 当遇到问题没有思路时, 我们可以通过具体的数据进行问题的分析, 从而解决比较复杂的问题.
当然在分析问题的时候, 可以配合写写画画, 更直观明确!