Ошибка в методах отображения и вставки (двусторонняя очередь)

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

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

вот так я вставляю 12 43 65 23 и когда make удалить из левой программы удалит 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 ответа

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

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

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

Те состоят из ArrayDeque, LinkedList (модифицированный с этим интерфейсом в Java 6), и одновременный LinkedBlockingDeque,

Другие вопросы по тегам