МЕНЮ

 

Гостевая книга

Форум

 

 

КАК ОРГАНИЗОВАТЬ ОЧЕРЕДЬ

            Что такое очередь? Очередь (в нашем привычном понимании) - это толпа людей, стоящих друг за другом, ожидающих купить какую-нибудь крутую вещь. И в компьютере очередь - это тоже толпа данных, стоящих друг за другом. В отличие от стека, в котором кто последний зашел, тот первый вышел - в очереди все наоборот - кто первый зашел - тот и выйдет первым - ему не придется ждать остальных. А вот кто зашел последним - тот и выйдет последним - ему придется подождать, пока выйдут остальные.
            Если мы положим в очередь числа 3,4,5, то получится что-то вроде такого:

            И выйдут они, соответственно, так же - 3,4,5. Как зашли, так и выйдут
            Как вы понимаете, очередь тоже поддерживает две операции - PUSH и POP - положить в очередь и достать из очереди. Но тут есть проблема - в человеческой очереди когда человек сделал "то, за чем он в очереди", то есть купил товар и ушел - очередь сдвигается за ним и становится на его место. Это конечно можно сделать и на компьютере, но это ДОЛГО. Сдвигать очередь после извлечения каждого числа это очень медленно.
            Но ведь если не сдвигать - и первый, и последний элемент очереди будут постепенно сдвигаться все дальше и дальше? Вот смотрите:

  1. Поместили в очередь элемент 1 - он на первом месте

  2. Поместили в очередь элемент 2 - он на втором месте

  3. Поместили в очередь элемент 3 - он на третьем месте

  4. Удалили элемент из очереди. Какой? Первый пришедший - то есть элемент 1. У нас первое место освободилось, а 2 и 3 заняты.

  5. Удалили элемент из очереди. Какой? Следующий пришедший - то есть элемент 2. У нас второе место освободилось, а третье занято.

            Видите - у нас уже первые два места пусты. А заполнятся ли они еще? Нет! Ведь если мы будем удалять элементы из очереди - они дадут только еще больше пустых элементов. А если добавлять - они добавятся в конец очереди - то есть на места 4,5,6,..., но на места 1 и 2 не встанут.
            А если мы захотим миллиард раз добавить и удалить один элемент? Очередь будет настолько сдвинута вправо, что никакой памяти не хватит! Что же делать?
            Все очень просто! Нужно закольцевать очередь! То есть если мы добавляем элемент в очередь - а места в очереди нет - то новый элемент становится в начало очереди (но мы конечно помним что он вовсе не первый, хоть и в начале). А если наоборот - мы доудаляли элементы до конца - то также переходим в начало и начинаем удалять оттуда.
            Пример: Очередь размером 3 элемента

  1. Поместили в очередь элемент 1 - он на первом месте

  2. Поместили в очередь элемент 2 - он на втором месте

  3. Поместили в очередь элемент 3 - он на третьем месте

  4. Удалили элемент из очереди. Какой? Первый пришедший - то есть элемент 1. У нас первое место освободилось, а 2 и 3 заняты.

  5. Удалили элемент из очереди. Какой? Следующий пришедший - то есть элемент 2. У нас второе место освободилось, а третье занято.

  6. Поместили в очередь элемент 4 - он на первом месте. Почему? Потому что должен бы быть на четвертом. Но в очереди всего 3 элемента - значит он перемещается в начало - на место уже удаленных элементов. Теперь у нас есть элемент на месте 3, а за ним элемент на месте 1.

  7. Удалили элемент из очереди. Какой? Следующий пришедший - то есть элемент 3. Освободилось третье место, но осталось первое.

  8. Удалили элемент из очереди. Какой? Следующий пришедший - то есть элемент 1. Все. Очередь пуста. Но! Обратите внимание что хоть она и пуста - следующий элемент будет сразу вторым - так как считается, что первый мы удалили и туда никто встать не может (пока очередь опять не переполнится).

            Теперь собственно должно стать понятно как реализовать очередь. У нас должно быть два указателя - один на начало очереди (на элемент который уйдет следующим) - "голова", другой на конец очереди (элемент, который уйдет последним) - "хвост".

  1. Чтобы поместить элемент в очередь - нужно увеличить хвост. Если он вышел за границы очереди - поместить его снова в начало. И поместить элемент на новое место

  2. Чтобы удалить элемент из очереди - нужно взять элемент, на который указывает голова, а далее УВЕЛИЧИТЬ голову (обратите внимание - все только увеличивается). Если она тоже вышла за границы очереди - тоже передвинуть в начало.

Назад  
 

Хостинг от uCoz