我正在尝试在JAVA中实现队列。我是初学者。我不明白为什么这行不通。 Push()工作正常,但pop()无法正常工作。有人可以指出我出了什么问题吗?
pop():
public void pop()
{
for(int i=0;i<length;i++)
{
while(i<(length-1))
{
arr[i]=arr[i+1];
}
}
}
push():
public void push(int x)
{
push:for(int i=0;i<length;i++)
{
if(arr[i]==null)
{
arr[i]=x;
break push;
}
}
}
show():
public void show()
{
int c=0;
for(int i=0;i<length;i++)
//if(arr[i]!=null)
{
System.out.println(arr[i]);
c++;
}
System.out.println("Current Capacity "+c+"/"+length);
}
main()
public static void main(String...i)
{
System.out.println("Stack Implementation");
Queue stack = new Queue();
System.out.println("Push");
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
stack.show();
System.out.println("Pop");
stack.pop();
stack.show();
}
运行pop()后,输出不显示任何数据。
答案 0 :(得分:0)
您不会在i
中增加pop()
,因此while循环将无限期地运行。
在推式中,您使用的是for循环,该循环递增i
::for(int i=0;i<length;i++ /*here*/)
您也不会在i
中初始化pop()
,因此它可能具有push()
中最后一个增量的值。该值将是下一个空元素的索引(如果还有一个),因此这还是错误的。但是,您想从前面弹出,所以您需要从i = 0
开始-在这种情况下,另一个for循环也可以工作,即您只需将i+1
处的element的值复制到索引i
并将最后一个元素设置为null
(为获得更高的效率,一旦i+1
具有null
元素,您可以停止)。
编辑:由于您已经为pop()
发布了更多代码,因此情况有所不同。您已经在pop()
中使用了for循环,但是在其中使用了另一个循环。我假设您想使用if(i<(length-1))
而不是while(i<(length-1))
-但在这种情况下,您仍然必须处理最后一个元素,即,一旦队列已满,则需要将最后一个元素设置为null
,当您弹出其中一个并移动其余部分时。
答案 1 :(得分:0)
当您按下元素时,您需要从方法中返回:
public void push(int x) {
for (int i = 0; i < length; i++) {
if (arr[i] == null) {
arr[i] = x;
return; // Exit from push when you added the element in the right position
}
}
}
请注意,此代码未优化。推送元素需要O(n),因此会浪费大量时间用于大队列,但这是最接近您的代码的解决方案。无论如何,可以通过引入一个保存最后使用的索引的变量来进行简单的优化。因此,您可以使用该变量来推送和弹出O(1)中的元素。