2011-04-10 4 views
1

До сих пор все это (по крайней мере, я надеюсь, что так лол) являетсяQueue Класс/IsEmpty метод

class Queue 
{ 

    private int front = 0; //Creates front and back int holders and an array 
    private int back = -1; 
    private int[] anArray; 

    public Queue(int size) // constructor to get the Queue size 
    { 
     anArray = new int[size]; 
    } 

    public bool IsFull 
    { 
     get // gets to see if the Queue is full (I assume I did this right, It's full if the back of the queue is equal to -1 of an array) 
     { 
      return back == anArray.Length - 1; 
     } 
    } 

    public bool IsEmpty 
    { 
     get // It's empty if the back is -1; I think this is where I messed up, I think that when it checks to see if it's empty it also doesn't check if it's empty when I have dequeued the other numbers (or write them off). Would I make something like "Return front == anArray.Length -1;" ? That would check to see when the front (The part being written to console first) hits the end of the array? 
     { 
      return back == -1; 
     } 
    } 

    public void Enqueue(int valueEnqueue) 
    { // Method to Enqueue the variables into the array 

     if (IsFull) 
     { 
      //do nothing 
     } 
     else 
     { 
      back = back + 1; 
      anArray[back] = valueEnqueue; 

     } 
    } 

    public int Dequeue() 
    { // Method to dequeue the variables put in 
     if (IsEmpty) 
     { 
      //do nothing 
      return 1010101010; 
     } 
     else 
     { 
      int dequeue = anArray[front]; 
      front = front + 1; 
      return dequeue; 
     } 
    } 

Так что я думаю, что мой вопрос, соблюдение нормального Queue мышления (First In First Out), как я могу заставить его остановиться? Я продолжаю получать индекс за пределами диапазона.

+0

140-колонковая строка не очень читаема. Пожалуйста, сломайте это. –

+0

Как это нечитаемо? Я пропустил строки и т. Д. – Nogg

+0

Вы не близко, это больше похоже на стек, чем на очередь. Вы должны использовать тег [homeework], чтобы получить необходимую помощь. –

ответ

0

На первый взгляд я подозреваю, что вы получаете исключение IndexOutOfRange в своей функции Dequeue, которая не имеет ограничений на переменную front, она просто продолжает увеличиваться при каждом вызове и в конечном итоге превышает длину массива.

Структура очереди обычно реализуется как круговой буфер. Взгляните сюда для получения более подробной информации, которая может помочь вам в реализации.

http://en.wikipedia.org/wiki/Circular_buffer

+0

Правильно, это то, что у меня есть в моем псевдокоде. Я гигантский круг. Я просто смущен тем, как управлять этим? – Nogg

+0

@Nog, ваш код не реализует циклический буфер, потому что передняя/задняя сторона должна обертываться до начала массива, когда они достигают конца, в настоящее время фронт, например, постоянно увеличивается. Взгляните на статью Википедии, с которой я связан. –

+0

Так что я должен что-то изменить в методе IsFull, чтобы сказать, когда он заполнен, чтобы запустить счетчик? – Nogg

1

Вы пытаетесь изобрести велосипед?

Почему бы не использовать: system.collections.queue?

http://msdn.microsoft.com/en-us/library/system.collections.queue.aspx

И если ваш просто хотите сделать так, попробуйте Отражатель на system.collections.queue и посмотреть, что внутри.

+1

Я предполагаю, что это домашнее задание. –

+0

@ Тайлер: +1. выглядит так. –

+0

@ Из вас, проверьте комментарии к моему оригинальному сообщению. – Nogg

0

У вас есть конечный массив и вы ожидаете бесконечной емкости. Массив не лучший контейнер для этого, вы должны использовать что-то еще для реализации вашей очереди, например, контейнер List.

Enqueue(item) { list.Add(item); } 
Dequeue() 
{ 
    if(!IsEmpty) 
    { 
    var item = list[0]; 
    list.Remove(item); 
    return item; 
    } 
    return null; 
} 
IsFull{ get { return false; } } 
IsEmpty{ get { return list.Count == 0; } 
Смежные вопросы