Ошибка в методах отображения и вставки (двусторонняя очередь)
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
,