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

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

то, когда я делаю, удаляют из правильной или левой программы, будет, удаляют верный, но когда я называю 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
1
задан Donal Fellows 23 May 2010 в 15:26
поделиться

3 ответа

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

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

0
ответ дан 3 September 2019 в 00:21
поделиться

Реализация display выполняет итерацию по массиву backing от 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), поэтому я соответствующим образом изменил пример кода и свой ответ.

1
ответ дан 3 September 2019 в 00:21
поделиться

Я подозреваю, что больше всего вас смущает ваш метод отображения... :

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 элементы, которые не имеют никакой связи с "логически присутствующими".

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

1
ответ дан 3 September 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: