队列在java中使用数组

时间:2014-01-29 16:07:21

标签: java queue

我只想在Queue中询问是否我的队列中已经有5个元素,并且它的限制为5.然后,我删除了一个元素。然后我插入一个元素。输出是否溢出是对的吗? 即使从队列中插入新元素,我的问题仍然存在。它总是说溢出。我想要的是在我的队列中添加更多元素。(我指的是上面的情况)

import java.io.*;  
import java.lang.*;  
class clrqueue  
{  
     DataInputStream get=new DataInputStream(System.in);  
     int a[];  
     int i,front=0,rear=0,n,item,count=0;  
void getdata()  
{  
    try  
    {  
         // to enter the limit

       System.out.println("Enter the limit");  
       n=Integer.parseInt(get.readLine());  
       a=new int[n];  
    }   
   catch(Exception e)  
    {  
       System.out.println(e.getMessage());  
   }  
}  
void enqueue()  
{  
  try  
   {  
     if(count<n)  
      {  
         System.out.println("Enter the element to be added:");  
         item=Integer.parseInt(get.readLine());  
         a[rear]=item;  
         rear++;  
         count++;  
      }  
     else  
         System.out.println("QUEUE IS FULL");  
   }  
   catch(Exception e)  
   {  
         System.out.println(e.getMessage());  
   }  
}  


    void dequeue()  
      {  
        if(count!=0)  
         {  
    System.out.println("The item deleted is:"+a[front]);  
    front++;  
    count--;  
    }  
   else  
    System.out.println("QUEUE IS EMPTY");  
  if(rear==n)  
   rear=0;  
  }  
  void display()  
  {  
   int m=0;  
   if(count==0)  
   System.out.println("QUEUE IS EMPTY");  
   else  
   {  
   for(i=front;m<count;i++,m++)  
   System.out.println(" "+a[i]);  
   }  
  }  
 }  
 class Myqueue  
 {  
  public static void main(String arg[])  
  {  
  DataInputStream get=new DataInputStream(System.in);  
  int ch;  
  clrqueue obj=new clrqueue();  
  obj.getdata();  
  try  
  {  
   do  
   {  
   System.out.println(" 1.Enqueue  2.Dequeue  3.Display  4.Exit");  
   System.out.println("Enter the choice");  
   ch=Integer.parseInt(get.readLine());  
   switch (ch)  
   {  
   case 1:  
       obj.enqueue();  
      break;  
   case 2:  
      obj.dequeue();  
      break;  
   case 3:  
      obj.display();  
      break;  
   }  
   }  
   while(ch!=4);  
  }  
  catch(Exception e)  
  {  
  System.out.println(e.getMessage());  
  }  
  }  
 }  

3 个答案:

答案 0 :(得分:2)

您想要实现循环队列。 重点是,请小心保持前后指针,否则会出现溢出或全部消息。请注意,当你执行前面的++,后面的++时,你可以让它们= n,每次做一个mod n会在必要的时候帮助它恢复到0。

front++;front%=n;

rear++;rear%=n;

for(i=front;m<count;i++,i%=n,m++) 

您的实施几乎是正确的,继续。

答案 1 :(得分:0)

由于您使用的是固定大小的数组,因此在删除元素时,您必须移动数组中的所有剩余元素。就目前而言,您只是继续增加rearfront,并导致溢出,因为这些变量最终会超出数组中的可用索引。您需要在执行操作时移动数组,或者相应地包装rearfront变量,使它们始终在0和限制之间。

在你的队列中尝试这一点。计数和后计数递减,因为数组向左移1。

void dequeue() {
    if (count != 0) {
        System.out.println("The item deleted is:" + a[front]);
        count--;
        rear--;
        System.arraycopy(a, 1, a, 0, count);
    } else
        System.out.println("QUEUE IS EMPTY");
    if (rear == n)
        rear = 0;
}

arraycopy方法将一个数组的内容复制到另一个数组中。第一个参数是源/当前数组,第二个参数是起始位置。您想要删除数组中的第一个元素,因此起始位置为1(数组中的第二个元素)。第三个参数是您希望复制数据的目标数组。在这个例子中,我只是复制到同一个数组。第四个参数是将添加数据的目标数组的起始索引。这是0因为我们想将该元素放在数组的前面。最后一个参数是要复制的元素数。 a[1]被复制到a[0]a[2]被复制到a[1],依此类推。

因此,例如,如果数组是[1,2,3,4],那么当我们复制时,计数将是3(当前计数已经减少,我们只复制最后3个元素)。由于start参数为1,这意味着复制的第一件事是a[1]

我们最终得到一个像:[2,3,4]

这样的数组

您可以在此处详细了解:oracle docs

这个其他stackoverflow问题也说明了如何使用for循环执行相同的操作: Java, Shifting Elements in an Array

答案 2 :(得分:0)