Форум программистов «Весельчак У»
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
Начало
Наши сайты
Галерея
Весельчак У
Наша Вики
Хранилище
Проекты
Правила
Правила форума
Правила русского языка
Помощь
Поиск
Календарь
Почта
Войти
Регистрация
Форум программистов «Весельчак У»
>
Программирование
>
C/C++
(Модератор:
Вад
) > Тема:
Очередь
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Очередь (Прочитано 8344 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AlexLn
Участник
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
»
Записан
Вад
Модератор
Offline
Пол:
Re: Очередь
«
Ответ #1 :
14-04-2010 12:07 »
Если очередь циклическая, фиксированного размера, - то почему бы и нет. Только если такая очередь переполнится, будет беда.
А вообще, не во всех. Автор врёт или не прав.
«
Последнее редактирование: 14-04-2010 12:09 от Вад
»
Записан
baldr
Команда клуба
Offline
Пол:
Дорогие россияне
Re: Очередь
«
Ответ #2 :
14-04-2010 12:09 »
Очень топорная работа... нет даже проверок на то что tail>head. Можно делать dequeue бесконечно...
А переноса я не вижу. Что ты имеешь в виду? Это просто кольцо.
Очередь не переполнится - стоит "%10"..
Записан
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Вад
Модератор
Offline
Пол:
Re: Очередь
«
Ответ #3 :
14-04-2010 12:14 »
baldr
, переполнится, если tail переползёт через head. Тогда очерёдность очевидно нарушится - а зачем тогда очередь?
Записан
baldr
Команда клуба
Offline
Пол:
Дорогие россияне
Re: Очередь
«
Ответ #4 :
14-04-2010 12:18 »
Ну, это просто вытесняющая очередь..
Но, опять же, дополнительные проверки нужны, иначе можно до бесконечности вытаскивать несуществующие элементы.
Записан
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
AlexLn
Участник
Offline
Re: Очередь
«
Ответ #5 :
15-04-2010 08:38 »
Извините, не всё сообщил. К этой очереди надо было сделать проверку переполнения и ещё чего. Но я с %10 не разобрался. Дано было как самая простая очередь. Нормально будет убрать %10 и сделать проверку?
Циклическая и вытесняющая это одно и то же? Первый элемент удаляется, последний добавляется?
Какие проверки делать в таких очередях?
Записан
Вад
Модератор
Offline
Пол:
Re: Очередь
«
Ответ #6 :
15-04-2010 08:41 »
%10 в данной реализации необходимо: оно обеспечивает нахождение индексов head и tail в рамках выделенного массива из 10 элементов. Можно заменить на проверку типа
Код:
if (tail>=10)
tail = 0
Записан
baldr
Команда клуба
Offline
Пол:
Дорогие россияне
Re: Очередь
«
Ответ #7 :
15-04-2010 08:48 »
В данном случае достаточно, думаю, будет сделать счетчик cnt кол-ва элементов очереди:
* ошибка при enqueue() если cnt>=10
* ошибка при dequeue() если cnt<=0
* инкремент при каждом enqueue()
* декремент при каждом dequeue()
Записан
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Форум программистов «Весельчак У»
>
Программирование
>
C/C++
(Модератор:
Вад
) > Тема:
Очередь
Загружается...