了解由两个队列

时间:2015-10-11 03:06:30

标签: java queue

我试图理解Mahmood Akhtar解释的here中的以下方法。请在下面找到代码段:

public void push(int data) {

        if (q1.peek() == null) {
            q1.add(data);
        } else {
            for (int i = q1.size(); i > 0; i--) {
                q2.add(q1.remove());
            }
            q1.add(data);
            for (int j = q2.size(); j > 0; j--) {
                q1.add(q2.remove());
            }

        }
    }

这是我所理解的:

步骤1:第一个if语句检查队列q1是否为空,如果它为空,则添加数据。

第2步:否则,由于q1已满,我们必须将数据从q1移至q2。因此,else语句中的第一个for循环基本上是从q1的大小开始并一直运行直到遇到最后一个元素。所有元素都移入q2。 q1中添加了一个新数据。

步骤3:对于q2,重复与步骤2相同的过程。

如果我的解释是否正确,请纠正我?

第二个问题:

在pop方法中:

public int pop() {
        if (q1.peek() == null) {
            System.out.println("The stack is empty, nothing to return");
            int i = 0;
            return i;
        } else {
            int pop = q1.remove();
            return pop;
        }
    }

为什么他们要从队列q1中删除第一个元素?因为队列q1中的第一个元素将根据FIFO原则而对于堆栈它应该是最后一个元素吗?

根据我的意思,他应该做的是,他应该将所有元素从q1转移到q2,直到剩下最后一个元素,然后从队列中删除该元素。如果我错了,请纠正我。

由于

2 个答案:

答案 0 :(得分:1)

  

步骤2:否则,因为q1已满,

这个假设是错误的。队列未满。它只检查它是否包含至少一个元素。如果它包含then,则首先将它们存储到一个单独的队列中,存储该元素,然后存储所有其他元素。所以它以逆转顺序存储元素。

  

他们为什么要从队列q1中删除第一个元素?

因为元素以相反的顺序存储。这就是推送方法的全部逻辑。

  

他应该将所有元素从q1转移到q2,直到剩下最后一个元素,然后从队列中删除该元素。

他只是这样做,只是你希望在pop()方法中发生这种情况,但代码是在push()方法中进行的。

答案 1 :(得分:-1)

  

根据我的意思,他应该做的是,他应该将所有元素从q1转移到q2,直到剩下最后一个元素,然后从队列中删除该元素。如果我错了,请纠正我。

并且在弹出操作结束时,q1和q2的角色被交换,因此所述解决方案将使该算法在弹出项目上最有效