Java 理解由两个队列实现的堆栈的Pop和Push操作逻辑
我试图从Mahmood Akhtar的解释中理解以下方法。请在下面查找代码段:Java 理解由两个队列实现的堆栈的Pop和Push操作逻辑,java,queue,Java,Queue,我试图从Mahmood Akhtar的解释中理解以下方法。请在下面查找代码段: 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()); }
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是否为null,如果为null,则添加数据
第2步:否则,由于q1已满,我们将不得不将数据从q1移动到q2。因此,else语句中的第一个for循环基本上从q1的大小开始,一直运行到遇到最后一个元素。所有元素都移动到q2中。将新数据添加到q1中
第3步:第2季度重复与第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:否则,由于q1已满
这种假设是错误的。队列未满。它只检查是否包含至少一个元素。如果包含,则首先将它们存储到单独的队列中,存储元素,然后存储回所有其他元素。因此,它以相反的顺序存储元素
他们为什么要从队列q1中删除第一个元素
因为元素是按相反的顺序存储的。这就是push方法的全部逻辑
他应该将所有元素从q1转移到q2,直到最后一个元素离开,然后从队列中删除该元素
他只是在这样做,只是您希望在pop()
方法中发生这种情况,但代码是在push()
方法中进行的
我认为他应该做的是,他应该将所有元素从q1转移到q2,直到最后一个元素离开,然后从队列中移除该元素。如果我错了,请纠正我
而且在pop操作结束时,q1和q2的角色被交换,因此所述的解决方案将使算法在弹出项时最有效@DanielImms您有关于使用队列实现堆栈的文章吗?我在链接中看到了使用堆栈的队列实现。另外,如果你能对我的问题提出一些看法,那就太好了。谢谢