2013-09-23 2 views
1

Я пытаюсь реализовать очередь с массивом. (Не использовать встроенные функции очереди Java). Однако при тестировании массив будет распечатываться только тогда, когда size == maxSize (как в размере массива, достигшем maxSize/capacity). За исключением случаев, когда печать меньше, чем maxSize, проходят тестовые примеры. (Это Очередь с двойным завершением, поэтому элементы могут быть добавлены спереди и сзади). Любой совет?Реализация очереди с Array-Java

package vipQueueArray; 

import java.util.NoSuchElementException; 


public class vipQueue { 

private Object[] array; 
private int size = 0; 
private int head = 0; // index of the current front item, if one exists 
private int tail = 0; // index of next item to be added 
private int maxSize; 

public vipQueue(int capacity) { 
    array = new Object[capacity]; 
    maxSize = capacity; 
    size = 0; 
    tail = maxSize - 1; 

} 

public Object Dequeue() { 
    if (size == 0) { 
     throw new NoSuchElementException("Cant remove: Empty"); 
    } 
    Object item = array[head]; 
    array[head] = null; 
    head = (head + 1) % array.length; 
    size--; 

    return item; 

} 

public void EnqueueVip(Object x) { 
    if (size == maxSize) { 
     throw new IllegalStateException("Cant add: Full"); 
    } 

    array[tail] = x; 
    tail = (tail - 1) % array.length; 
    size++; 

} 

public void Enqueue(Object y) { 
    if (size == maxSize) { 
     throw new IllegalStateException("Cant add: Full"); 
    } 
    array[head] = y; 
    head = (head + 1) % array.length; 
    size++; 

} 

public boolean isFull() { 
    return (size == maxSize); 
} 

public boolean isEmpty() { 
    return (size == 0); 
} 

}

public class Test{ 
     public static void main(String[] args){ 

      vipQueue Q = new vipQueue(2); 
      Q.Enqueue(4); 






     System.out.printf("->%d", Q.Dequeue()); 
     } } 
+0

я не могу найти какие-либо проблемы в коде, кроме как я могу добавить элемент в начало очереди. Я думаю, проблема в самом тестовом случае, можете ли вы опубликовать ее также? – Rami

+0

, поэтому maxSize равен 2, и добавляется только один элемент. но dequeue выводит нуль. – Fish

+0

'Enqueue' и' Dequeue' используют 'head'. Я ожидал бы этого из стека, а не из очереди. –

ответ

1

Когда вы епдиеие, вы настраиваете голова = голова + 1. Если вы из очереди, вы возврат массива [голова]

Ergo, после Епдиеие , head = 1, но элемент, который вы добавили, находится в слоте 0.

Кроме того, наличие tail = capacity-1, когда ничего в очереди не вызовет проблемы. En

+0

так что твой совет? – Fish

4

В DEQUEUE вы делаете:

head = (head + 1) % array.length; 

вы должны (в соответствии с осущ.) Изменить его на:

head = (head - 1) % array.length; 

Добавление:

Это не реализация очереди: очередь работает в FIFO, и то, что вы реализовали, работает LIFO, который на самом деле больше похож на ... стек.

Чтобы реализовать очередь, вы должны начать с головы & хвоста, указывающего на массив [0]. Тогда каждая вставка addAtTail(), что означает, что элемент будет введен в массив [хвост]:

array[tail] = item; 
tail++; 
size++; 

Прекратите вставив когда хвост == array.length (перекидной исключение).

Dequeue означает удаление элемента на array[tail-1], а затем делать:

tail--; 
size--; 
+0

Я предполагаю, что он пытается что-то сделать, если у вас есть предметы в слотах 1 2 3, и вы удаляете элемент 1, голова должна быть в 2, а не 0. (Но он не должен удаляться из головы в любом случае, если это «очередь»). – James

+0

Я удаляю элемент в передней части ... в моей функции dequeue – Fish

+0

@ Джеймс, вы правы - эта реализация Queue ведет себя скорее как стек :), когда вы ставите в очередь, глава не должен «двигаться», только хвост ... – alfasin

Смежные вопросы