когда очередь заполнена? - PullRequest
       10

когда очередь заполнена?

0 голосов
/ 05 октября 2010

Я видел много способов проверить, когда очередь заполнена, но я ничего не понимаю, поэтому, простыми словами, когда очередь заполнена?

(Если есть код, пожалуйста, сделайте его на C ++ или псевдокоде)

У меня есть этот код, чтобы проверить, заполнена ли очередь: -

myFront != (myBack+1) % max

(например,почему это не просто "myBack == max")

Ответы [ 3 ]

2 голосов
/ 05 октября 2010

Очередь заполнена, когда у вас больше нет места для постановки в очередь / вставки новых элементов, будь то ограничения памяти или программные ограничения. (при условии, что он ограничен)

Отметьте здесь (википедия) , и он показывает пример C # с пределом "размера".

Фрагмент кода (по ссылке выше):

#region Constructor
public Queue(int Size)
 {
     this._Size = Size;
 }

 //Enqueue
if (this.IsFull())
{
    throw new Exception("Queue is full !");
}
... do enqueue

// check full
public virtual bool IsFull()
{
   return (this._Count == this._Size);
}
0 голосов
/ 07 октября 2010

Этот вопрос, похоже, касается циклической очереди, реализованной с помощью массива.В этом случае myFront, myBack и myBack+1 должны находиться в диапазоне [0,max).Большую часть времени вы можете проверить полную очередь, проверив myFront != (myBack+1).Еще один случай, когда эта простая проверка не может быть верной, - это когда myBack==max-1 и myFront==0.Добавление в модуль % упрощает код, объединяя два случая в одну проверку, потому что (max-1)+1 % max == 0.

0 голосов
/ 06 октября 2010

Статья в Википедии en.wikipedia.org / wiki / Circular_buffer , цитируемая Helper Method, дает очень хорошее объяснение этого (включая диаграммы), которое я не буду повторять здесь.

Тест «myFront! = (MyBack + 1)% max» подразумевает, что код использует стратегию «Всегда держать один слот открытым» для обнаружения полной очереди;в статье в википедии есть пример кода, который использует тот же самый тест для «переполнения буфера» (они пишут это как: (end + 1) % BUFFER_SIZE != start).

В случае, если неясно, цель "(myBack + 1)% max "- добавить 1 в myBack, и если результат == max, вместо этого установить значение 0. 0. 1008 *

...