#c# #queue
#c# #очередь
Вопрос:
Пока все это делает (по крайней мере, я на это надеюсь, лол)
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;
}
}
Итак, я предполагаю, в чем заключается мой вопрос, придерживаясь обычного мышления в очереди (первый вход — первый выход), как мне остановить это? Я продолжаю получать ошибку «Индекс вне диапазона».
Комментарии:
1. Строка из 140 столбцов не очень удобочитаема. Пожалуйста, разбейте это.
2. Как это нечитаемо? Я пропустил строки и т.д.
3. Вы не близки, это больше похоже на стек, чем на очередь. Вы должны использовать тег [домашнее задание], чтобы получить необходимую помощь.
4. Раньше никогда не возникало проблем. Если у вас нет конструктивных комментариев, пожалуйста, не публикуйте. Спасибо.
5. @Nogg: он имеет в виду, что комментарии нечитабельны, поскольку все они находятся на одной строке, и вам приходится прокручивать.
Ответ №1:
Вы пытаетесь изобрести велосипед?
Почему бы не использовать: system.collections.очередь?
http://msdn.microsoft.com/en-us/library/system.collections .queue.aspx
И если вы просто хотите это сделать, попробуйте Reflector в system.collections.поставьте в очередь и посмотрите, что внутри.
Комментарии:
1. @ Вы оба, проверьте комментарии к моему оригинальному сообщению.
Ответ №2:
На первый взгляд я подозреваю, что вы получаете исключение IndexOutOfRange в вашей функции Dequeue, которая не имеет ограничений на front
переменную, она просто продолжает увеличиваться при каждом вызове и в конечном итоге превысит длину массива.
Структура очереди обычно реализуется в виде циклического буфера. Взгляните здесь на более подробную информацию, которая может помочь вам с вашей реализацией.
Комментарии:
1. Правильно, это то, что у меня есть в моем псевдокоде. Я гигантский круг. Я просто не понимаю, как с этим работать?
2. @Nog, ваш код не реализует циклический буфер, потому что front / back должны обтекаться до начала массива, когда они достигают конца, в настоящее время front, например, постоянно увеличивается. Взгляните на статью в Википедии, на которую я ссылался.
3. Итак, должен ли я что-то изменить в методе isFull, чтобы указать, когда он заполнен, чтобы запустить счетчик заново?
4. @Nogg, не только в вашем методе isFull, но и при удалении из очереди. Я уверен, что если вы будете работать в соответствии с алгоритмом, приведенным в статье в Википедии, вы значительно улучшите свою реализацию.
Ответ №3:
У вас конечный массив, и вы ожидаете бесконечную емкость. Массив — не лучший контейнер для этого, вам следует использовать что-то другое для реализации вашей очереди, например, контейнер 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; }