用两个栈实现一个队列的问题

333 阅读2分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动。

问题

用两个栈实现一个队列

使用两个先进后出的栈实现一个先进先出的队列

考察要点

队列的特点为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();
     }
 }

总结

本题考察我们对于栈和队列的理解能力, 也同样考察我们的思维发散能力. 当遇到问题没有思路时, 我们可以通过具体的数据进行问题的分析, 从而解决比较复杂的问题.

当然在分析问题的时候, 可以配合写写画画, 更直观明确!