我只想在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());
}
}
}
答案 0 :(得分:2)
您想要实现循环队列。 重点是,请小心保持前后指针,否则会出现溢出或全部消息。请注意,当你执行前面的++,后面的++时,你可以让它们= n,每次做一个mod n会在必要的时候帮助它恢复到0。
front++;front%=n;
rear++;rear%=n;
for(i=front;m<count;i++,i%=n,m++)
您的实施几乎是正确的,继续。
答案 1 :(得分:0)
由于您使用的是固定大小的数组,因此在删除元素时,您必须移动数组中的所有剩余元素。就目前而言,您只是继续增加rear
和front
,并导致溢出,因为这些变量最终会超出数组中的可用索引。您需要在执行操作时移动数组,或者相应地包装rear
和front
变量,使它们始终在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)