Помощь - Поиск - Пользователи - Календарь
Полная версия: Нужна помощь с очередями
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Черный Менестрель
Товарищи, очень нужна ваша помощь!

Необходимо реализовать очередь 2мя способами: на базе массива и на базе динамических структур данных (да-да, массив не труЪ, однако что поделать, такое задание выдали=( ). В каждом случае необходимо реализовать следующие операции:

1. Включить элемент в очередь
2. Исключить элемент из очереди
3. Найти в очереди элемент с заданным значением
4. Соединить 2 очереди в одну
5. Отсортировать очередь

Сказать по правде я в линейных списках нихрена не понимаю, поэтому если кто возьмется помочь, пожалуйста, комментарии в коде оставьте, если не трудно

ЗЫ: в теме "Все о динамических структурах данных" был, модуль качал.

Заранее спасибо всем, кто откликнется!
Lapp
Цитата(Черный Менестрель @ 25.10.2009 17:31) *
(да-да, массив не труЪ,
Я долго старался понять, но так и не врубился - что тут зашифровано?.. blink.gif "не трудно"?

Если честно, мне совсем не нравится задание. Отсортировать очередь?.. на фига?? Это классно: отстоял полчаса, подходишь к прилавку, бдруг - бац! приходит кто-то умный и сортирует всех по росту - и я снова в конце? "Зачем?" - спрашиваю. "Because I can!" - отвечает..

То же самое по поводу многих остальных пунктов (типа поиска). В реализации очереди должны быть ДВЕ операции: положить и вынуть. Все. Ну, дополнительно можно приделать запрос длины и еще что-то сервисное. Но для обработки информации (коей является сортировка и выборка) очередь НЕ ДОЛЖНА использоваться. Ботинок не следует использовать как миску для супа, хотя принципиально это и возможно.
Черный Менестрель
Цитата(Lapp @ 26.10.2009 5:23) *

Я долго старался понять, но так и не врубился - что тут зашифровано?.. blink.gif "не трудно"?


Ну что за очередь в массиве? Для добавления/удаления элемента надо или постоянно держать массив максимальной длины в памяти (уже плохо), либо создавать новый, туда все переписывать, удалять старый. Ерунда какая-то

Цитата
сли честно, мне совсем не нравится задание. Отсортировать очередь?.. на фига?? Это классно: отстоял полчаса, подходишь к прилавку, бдруг - бац! приходит кто-то умный и сортирует всех по росту - и я снова в конце? "Зачем?" - спрашиваю. "Because I can!" - отвечает..


А насчет задания - вот такая вот бредовая лаба у нас. Причем без какой-либо дополнительной инфы. Листок в зубы и делайте как хотите =(
volvo
Цитата
Листок в зубы и делайте как хотите =(
Ну, так делай... Ты ж говорил, что
Цитата
в теме "Все о динамических структурах данных" был, модуль качал.
? Неужели не заметил там же мой пост о сортировке очереди, реализованной динамическим списком? Так одна часть задания у тебя уже должна быть готова полностью: та, что с дин. списком. А там уже (по аналогии) и с массивами доделать - раз плюнуть. Ты хоть начни что-то делать, покажи, что пытаешься, а то смахивает на "сделайте мне задание, а я пойду, сдам и еще семестр делать ничего не буду"...
andriano
Цитата(Черный Менестрель @ 26.10.2009 9:22) *

Ну что за очередь в массиве? Для добавления/удаления элемента надо или постоянно держать массив максимальной длины в памяти (уже плохо), либо создавать новый, туда все переписывать, удалять старый. Ерунда какая-то
Не скажи.
Стандартный метод организации очереди - кольцевой буфер.
Имеет целый ряд достоинств: бысто, не нужно каждый раз дергать менеджер памяти, прозрачно, просто...
Есть одно принципиальное ограничение - фиксированная иаксимальная длина. Но это именно ограничение, а не недостаток, т.к. в большинстве практических случаев такое ораничение нужно вводить искусственно, если его нет. Например, в DOS длина очереди в буфере клавиатуры равнялась 16 введенным символам. И этого вполне хватало. Более того, это было полезно: исчерпание буфера могло происходить только в случае, если прикладная программа вовремя не опустошала буфер, а это обычно происходило лишь в случае каких-либо проблем. В этом случае вполне естественным было как можно раньше информировать пользователя об имеющихся проблемах, а не давать ему возможности вводить килобайты текста, если все равно этот текст в дальнейшем будет потерян.

Кстати, на баже массивов вполне успешно и рационально формируются даже такие принципиально динамические структуры как списки.
Так что массив - вещь универсальная.
Черный Менестрель
Цитата
Ты хоть начни что-то делать, покажи, что пытаешься, а то смахивает на "сделайте мне задание, а я пойду, сдам и еще семестр делать ничего не буду"...

Так я начал =) Перерыл кучу инфы, нашел еще модуль для очереди, в приложении он, однако сортировки там нет.

Цитата
Неужели не заметил там же мой пост о сортировке очереди, реализованной динамическим списком?

Вот за это прошу прощения, действительно просмотрел, сегодня утром когда пересматривал сохраненную информацию обнаружил этот пост.

С массивами я поковыряюсь, благо в них более-менее понимаю, однако с динамическими еще остались загвоздки. Вообще, если честно, я ни черта не понимаю в этих указателях и тд, потому хотелось бы спросить, во-первых по сортировке. В целом я понимаю, что происходит, но некоторые действия мне неясны, в частности
Код
empty := not assigned(head)
   . . . . .. . . . .
while assigned(p) do


Для чего в этих строках служит assigned?


Вернусь к найденному мной модулю (в приложении), очередь там, как и в вашем примере сортировки, как объект рассматривается. Правда я не понимаю смысла некоторых операций, в частности
function Begining : E;
function IsNotEmpty : boolean; (для чего ее добавили, если рядом function IsEmpty : boolean; ?)

function OutBegining : E;
Procedure DelBegining;
Эти функция и процедура судя по результатам одно и то же выполняют, или я не прав.


ЗЫ: а про объединение очередей вообще никакой информации найти не удалось ((



Lapp
Цитата(Черный Менестрель @ 26.10.2009 18:11) *
некоторые действия мне неясны, в частности
 empty := not assigned(head)
. . . . .. . . . .
while assigned(p) do
Для чего в этих строках служит assigned?
Проверка, была ли выделена память под переменные head и p соответственно.

Цитата(Черный Менестрель @ 26.10.2009 18:11) *
function Begining : E;
function IsNotEmpty : boolean; (для чего ее добавили, если рядом function IsEmpty : boolean; ?)
Либо автор не знаком с операцией NOT, либо крепко ее невзлюбил..

Цитата(Черный Менестрель @ 26.10.2009 18:11) *
function OutBegining : E;
Procedure DelBegining;
Эти функция и процедура судя по результатам одно и то же выполняют, или я не прав.
Подобное в некоторых случаях оправдано. Особенно, если нельзя вызвать функцию как процедуру (без присваивания). Но в целом, согласен, лишнее. Вообще, я бы не стал рекомендовать этот найденный тобой модуль в качестве примера для подражания..

Цитата(Черный Менестрель @ 26.10.2009 18:11) *
ЗЫ: а про объединение очередей вообще никакой информации найти не удалось ((
А голова на что? Ты правда надеешься всегда все "находить"?..

Пожалуйста, используй тэг code=pas для паскалевских программ
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.