Класс очереди / метод IsEmpty - PullRequest
1 голос
/ 10 апреля 2011

Пока все это делает (по крайней мере, я надеюсь, что так),

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;
        }
    }

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

Ответы [ 3 ]

1 голос
/ 10 апреля 2011

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

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

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

А еслиВы просто хотите это сделать, попробуйте Reflector на system.collections.queue и посмотрите, что внутри.

0 голосов
/ 10 апреля 2011

Вы имеете конечный массив и ожидаете бесконечной емкости.Массив не лучший контейнер для этого, вы должны использовать что-то еще для реализации своей очереди, например контейнер 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; }
0 голосов
/ 10 апреля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...