Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Очередь  (Прочитано 9542 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
AlexLn
Участник

ru
Offline Offline

« : 14-04-2010 11:29 » 

Код очереди:
Код:
class queue
{
private:
  int head, tail; // начальный и конечный индексы
  int q[10]; // очередь из десяти элементов

public:
  queue() : head(0),tail(0) // конструктор
  {}
  void enqueue(int number) // добавление в очередь
  {
  q[tail] = number;
  tail = (tail+1) % 10;
  }
  int dequeue () // удаление из очереди
  {
  int temp = q[head];
  head = (head+1) % 10;
  return temp;
  }
};
Не понимаю: Зачем переносить последний элемент в начало?
(Автор кода говорит, так положено во всех очередях)
« Последнее редактирование: 14-04-2010 11:34 от Sel » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 14-04-2010 12:07 » 

Если очередь циклическая, фиксированного размера, - то почему бы и нет. Только если такая очередь переполнится, будет беда.

А вообще, не во всех. Автор врёт или не прав.
« Последнее редактирование: 14-04-2010 12:09 от Вад » Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #2 : 14-04-2010 12:09 » 

Очень топорная работа... нет даже проверок на то что tail>head. Можно делать dequeue бесконечно...
А переноса я не вижу. Что ты имеешь в виду? Это просто кольцо.
Очередь не переполнится - стоит "%10"..
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 14-04-2010 12:14 » 

baldr, переполнится, если tail переползёт через head. Тогда очерёдность очевидно нарушится - а зачем тогда очередь?
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #4 : 14-04-2010 12:18 » 

Ну, это просто вытесняющая очередь.. Улыбаюсь
Но, опять же, дополнительные проверки нужны, иначе можно до бесконечности вытаскивать несуществующие элементы.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
AlexLn
Участник

ru
Offline Offline

« Ответ #5 : 15-04-2010 08:38 » 

Извините, не всё сообщил. К этой очереди надо было сделать проверку переполнения и ещё чего. Но я с %10 не разобрался. Дано было как самая простая очередь. Нормально будет убрать %10 и сделать проверку?
Циклическая и вытесняющая это одно и то же? Первый элемент удаляется, последний добавляется?
Какие проверки делать в таких очередях?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 15-04-2010 08:41 » 

%10 в данной реализации необходимо: оно обеспечивает нахождение индексов head и tail в рамках выделенного массива из 10 элементов. Можно заменить на проверку типа
Код:
if (tail>=10)
   tail = 0
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #7 : 15-04-2010 08:48 » 

В данном случае достаточно, думаю, будет сделать счетчик cnt кол-ва элементов очереди:
* ошибка при enqueue() если cnt>=10
* ошибка при dequeue() если cnt<=0
* инкремент при каждом enqueue()
* декремент при каждом dequeue()
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines