Ошибка в методах отображения и вставки (двусторонняя очередь) - PullRequest
1 голос
/ 23 мая 2010

1) Моя проблема

когда я сделаю удаление из правой или левой программы, будет удалено true но когда я вызываю метод diplay, содержимое неправильно

как это Я вставляю 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

Ответы [ 3 ]

1 голос
/ 23 мая 2010

Реализация display перебирает вспомогательный массив от 0 до item_num, поэтому выводит неправильные значения. Вместо этого следует выполнить итерацию от front до 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 индексирует последний элемент очереди (а не один после последнего элемента, как обычно в реализациях очереди I я видел), поэтому я изменил пример кода и мой ответ соответственно.

1 голос
/ 23 мая 2010

Я подозреваю, что вас больше всего смущает ваш 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("");
}

в этом методе вы полностью игнорируете «внутреннюю логическую структуру» закодированной очереди, которая в решающей степени зависит от индексов front и rear: действительно, обратите внимание, что вы даже не упоминаете любой из этих индексов здесь - вы просто печатаете "физически первые" item_num элементы, которые не имеют никакого отношения к "логически присутствующим" элементам.

Вместо этого вам нужно начать с front-го элемента (, а не 0-го элемента!) И показать элементы item_num, начинающиеся там (с переносом в конце, если вы встретить это, конечно). Это отобразит логическое содержимое вашей очереди вместо фрагмента «random-oid» массива, который его реализует! -)

0 голосов
/ 24 мая 2010

Если это не домашняя работа, и вы используете Java 6 или новее, почему бы просто не использовать встроенный Deque s?

Они состоят из ArrayDeque, LinkedList (модифицировано с помощью этого интерфейса в Java 6) и одновременно LinkedBlockingDeque.

...