1

1)我的问题

当我从右侧或左侧程序中删除时将删除 true 但是当我调用显示方法时内容错误

像这样我插入 12 43 65 23 并且当从左侧程序中删除时将删除 12 但是当调用显示方法显示如下 12 43 65

并且当从正确的程序中删除时将删除 23 但当调用显示方法时显示如下 12 43

为什么 ??????);

当我尝试在删除后插入时写这个

无法正确插入,因为队列已满。首先删除权利,然后你可以插入权利

问题出在哪里 ??

请帮我

2)我的代码

头等舱

class dqueue
{
    private int fullsize;                    //number of all cells
    private int item_num;                    // number of busy cells only
    private int front,rear;
    public int j;
    private double [] dqarr;
//==========================================
    public dqueue(int s)                      //constructor
    {
        fullsize = s;
        front = 0;
        rear = -1;
        item_num = 0;
        dqarr = new double[fullsize];
    }
//==========================================
    public void insert(double data)
    {
        if (rear == fullsize-1)
            rear = -1;
        rear++;
        dqarr[rear] = data;
        item_num++;

    }
   public double removeLeft() // take item from front of queue
     {
   double temp = dqarr[front++]; // get value and incr front
   if(front == fullsize) 
   front = 0;
   item_num --; // one less item
   return temp;
    }
    public double removeRight() // take item from rear of queue
     {
   double temp = dqarr[rear--]; // get value and decr rear
   if(rear == -1) // 
   rear = item_num -1;
   item_num --; // one less item
   return temp;
    }
//=========================================

     public void display ()                //display items
{
for (int j=0;j<item_num;j++)               // for every element 
System.out.print(dqarr[j] +"  " );          // display it 
System.out.println("");
}

//=========================================
public int size()              //number of items in queue
{
return item_num;
}
//==========================================
public boolean isEmpty()       // true if queue is empty
{
return (item_num ==0);
}


} 

二等

import java.util.Scanner;
class dqueuetest
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        System.out.println("              ***** Welcome here***** ");
        System.out.println("              *****  Mind Of Programming Group***** ");
       System.out.println("               _____________________________________________ ");
        System.out.println("enter size of your dqueue");
        int size = input.nextInt();
        dqueue mydq = new dqueue(size);
        System.out.println("");
        System.out.println("enter your itemes");
//=====================================
        for(int i = 0;i<=size-1;i++)
        {
           System.out.printf("item %d:",i+1);
           double item = input.nextDouble();
           mydq.insert(item);
           System.out.println("");
        }    

//=====================================  
int queue =size ;         
int c = 0 ;
while (c != 6)
{
    System.out.println("");
    System.out.println("************************************************");
    System.out.println("               MAIN MENUE");
    System.out.println("1- INSERT RIGHT  ");
    System.out.println("2- REMOVE LEFT");
    System.out.println("3- REMOVE RIGHT");
    System.out.println("4- DISPLAY");
    System.out.println("5- SIZE");
    System.out.println("6- EXIT");  
    System.out.println("************************************************");
    System.out.println("choose your operation by number(1-6)");  
    c = input.nextInt();
    switch  (c)
    {
    case 1:
   if (queue == size)
    System.out.print("Can not insert right because the queue is full . first remove right and then u can insert right   ");
          else { System.out.print("enter your item: ");
           double item = input.nextDouble();
           mydq.insert(item);}
          break;

   case 2:
       System.out.println("REMOVE FROM REAR :");
              if( !mydq.isEmpty() )
    {
  double item = mydq.removeLeft();

  System.out.print(item + "\t");
    } // end while
  System.out.println("");
  mydq.display();

    break;

   case 3:
    System.out.println("REMOVE FROM FRONT :");
            if( !mydq.isEmpty() )
    {
  double item = mydq.removeRight();

  System.out.print(item + "\t");
    } // end while
  System.out.println("");
  mydq.display();
     break;

    case 4:
    System.out.println("The items in Queue are :");  
        mydq.display();
    break;

    case 5:
     System.out.println("The  Size of the Queue is :"+mydq.size());
    break;

    case 6:
    System.out.println("Good Bye");

    break;

    default:
    System.out.println("wrong chiose enter again");
  }       //end switch
 }       //end while
}        // end main     

}//end class
4

3 回答 3

1

的实现display从 0 到 迭代支持数组item_num,因此它打印错误的值。front它应该从to迭代rear(检查是否在缓冲区末尾包装索引)以打印出队列的实际内容:

public void display() {
  int j = front;
  for (int count = 0; count < item_num; count++) {
    System.out.print(dqarr[j] + "  ");
    j = increment(j);
  }
  System.out.println();
}

private int increment(int index) {
  if (index == fullsize - 1)
    return 0;
  return ++index;
}

我定义了increment一种在一个地方实现索引步进的方法——你在代码中的多个地方都有这个。

进一步注意,您的实现中没有溢出检查:如果我将fullsize + 1元素添加到队列中,第一个元素将被静默覆盖。

更新:我意识到在您的队列实现中rear索引队列的最后一个元素(不是最后一个元素之后的那个,就像我见过的出队实现中通常那样),所以我相应地修改了代码示例和我的答案。

于 2010-05-23T15:23:43.167 回答
1

我怀疑最让你困惑的是你的display方法......:

public void display ()                //display items
{
    for (int j=0;j<item_num;j++)               // for every element 
        System.out.print(dqarr[j] +"  " );          // display it 
    System.out.println("");
}

在这种方法中,您完全忽略了您编码的队列的“内部逻辑结构”,这在很大程度上取决于frontrear索引:确实,请注意,您甚至没有在此处提及这些索引中的任何一个-您只需打印“物理上优先”item_num的元素,它们与“逻辑上存在”的元素没有任何关系。

相反,您需要从front第 th 元素(不是第th 元素0!)开始并显示item_num从那里开始的元素(当然,如果您遇到它,则在末尾带有环绕)。这将显示队列的逻辑内容,而不是实现它的数组的“随机样体”切片!-)

于 2010-05-23T15:20:36.160 回答
0

如果这不是家庭作业并且您使用的是 Java 6 或更新版本,为什么不直接在内置的Deques 上使用呢?

其中包括ArrayDeque, LinkedList(在 Java 6 中使用此接口进行了改造)和并发LinkedBlockingDeque.

于 2010-05-24T19:42:15.563 回答