使用数组的JAVA队列实现

时间:2018-12-18 16:15:30

标签: java arrays queue

我正在尝试在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()后,输出不显示任何数据。

2 个答案:

答案 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)中的元素。