我试图理解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,直到剩下最后一个元素,然后从队列中删除该元素。如果我错了,请纠正我。
由于
答案 0 :(得分:1)
步骤2:否则,因为q1已满,
这个假设是错误的。队列未满。它只检查它是否包含至少一个元素。如果它包含then,则首先将它们存储到一个单独的队列中,存储该元素,然后存储所有其他元素。所以它以逆转顺序存储元素。
他们为什么要从队列q1中删除第一个元素?
因为元素以相反的顺序存储。这就是推送方法的全部逻辑。
他应该将所有元素从q1转移到q2,直到剩下最后一个元素,然后从队列中删除该元素。
他只是这样做,只是你希望在pop()
方法中发生这种情况,但代码是在push()
方法中进行的。
答案 1 :(得分:-1)
根据我的意思,他应该做的是,他应该将所有元素从q1转移到q2,直到剩下最后一个元素,然后从队列中删除该元素。如果我错了,请纠正我。
并且在弹出操作结束时,q1和q2的角色被交换,因此所述解决方案将使该算法在弹出项目上最有效