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
Если это не домашнее задание и вы используете Java 6 или новее, почему бы просто не использовать встроенные Deque
?
Они состоят из ArrayDeque
, LinkedList
(модифицированный этим интерфейсом в Java 6) и параллельный LinkedBlockingDeque
.
Реализация 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), поэтому я соответствующим образом изменил пример кода и свой ответ.
Я подозреваю, что больше всего вас смущает ваш метод отображения
... :
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
элементы, начиная с этого (с разворачиванием в конце, если вы его встретите, конечно). Это отобразит логическое содержимое вашей очереди вместо "случайно-оидного" среза реализующего ее массива!)