Линейные списки. Стек. Дек. Очередь
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: реферати, сочинение 5 класс
| Добавил(а) на сайт: Губанов.
Предыдущая страница реферата | 1 2 3 4 5 6 7 8 9 10 11 | Следующая страница реферата
Из стека мы всегда исключаем "младший" элемент из имеющихся в списке, т. е. тот, который был включен позже других. Для очереди справедливо в точности противоположное правило: исключается всегда самый "старший" элемент; узлы покидают список в том порядке, в котором они в него вошли.
Стеки очень часто встречаются в практике. Простым примером может
служить ситуация, когда мы просматриваем множество данных и составляем
список особых состояний или объектов, которые должны обрабатываться
позднее; когда первоначальное множество обработано, мы возвращаемся к этому
списку и выполняем последующую обработку, удаляя элементы из списка, пока
список не станет пустым. Для этой цели пригодны как стек, так и очередь, но
стек, как правило, удобнее. При решении задач наш мозг ведет себя как
"стек": одна проблема приводит к другой, а та в свою очередь к следующей;
мы накапливаем в стеке эти задачи и подзадачи и удаляем их по мере того, как они решаются. Аналогично процесс входов в подпрограммы и выходов из них
при выполнении машинной программы подобен процессу функционирования стека.
Стеки особенно полезны при обработке языков, имеющих структуру вложений. К
ним относятся языки программирования, арифметические выражения и немецкие
"Schachtelsatze" /буквально "вложенные предложения"/. Вообще, стеки чаще
всего возникают в связи с алгоритмами, имеющими явно или неявно рекурсивный
характер.
Представьте себе, что четыре железнодорожных вагона находятся на
входной стороне пути (рис. 1) и перенумерованы соответственно 1, 2, 3 и 4.
Предположим, что мы выполняем следующую последовательность операций
(которые согласуются с направлением стрелок на рисунке и не требуют, чтобы
вагоны "перепрыгивали" друг через друга). Отправьте:
|(а) вагон 1 в стек; |(е) вагон 4 в стек; |
|(b) вагон 2 в стек; |(f) вагон 4 на выход; |
|(с) вагон 2 на выход; |(g) вагон 3 на выход; |
|(d) вагон 3 в стек; |(h) вагон 1 на выход. |
В результате этих операций первоначальный порядок вагонов, 1234, изменился на 2431. Цель этого упражнения состоит в том, чтобы исследовать, какие перестановки можно получить, используя стеки, очереди и деки.
В стеке элемент добавляется и удаляется только с одного конца. На рисунке это элемент N. То есть если он добавился, то удаляется может сначала только он, а уж потом все остальные.
Стек можно представить себе как коробку, в которую складывают какие-
нибудь предметы, чтобы достать самый нижний нужно предварительно вытащить
остальные. Стек можно уподобить стопке тарелок, из которой можно взять
верхнюю и на которую можно положить новую тарелку. [Другое название стека в
русской литературе — «магазин» — понятно всякому, кто разбирал автомат
Калашникова].
Дек (deck) (стек с двумя концами) — линейный список, в котором все включения и исключения (и обычно всякий доступ) делаются на обоих концах списка.
Иногда аналогия с переключением железнодорожных путей, предложенная Э.
Дейкстрой, помогает понять механизм стека. На рис. 2. Изображен дек в виде
железнодорожного разъезда.
[pic]
Следовательно, дек обладает большей общностью, чем стек или очередь; он имеет некоторые общие свойства с колодой карт (в английском языке эти слова созвучны). Мы будем различать деки с ограниченным выходом или ограниченным входом; в таких деках соответственно исключение или включение допускается только на одном конце.
В деке все исключения и добавления происходят на обоих его концах. Дек по сути двунаправленный список.
В связанном списке (linked list) элементы линейно упорядочены, но порядок определяется не номерами, как в массиве, а указателями, входящими в состав элементов списка. Списки являются удобным способом хранения динамических множеств, позволяющим реализовать все операции, (хотя и не всегда эффективно).
Если каждый стоящий в очереди запомнит, кто за ним стоит, после чего все в беспорядке рассядутся на лавочке, получится односторонне связанный список; если он запомнит ещё и впереди стоящего, будет двусторонне связанный список.
Другими словами, элемент двусторонне связанного списка (doubly linked
list) — это запись, содержащая три поля: key (ключ) и два указателя — next
(следующий) и prev (от previous—предыдущий). Помимо этого, элементы списка
могут содержать дополнительные данные. Если х — элемент списка, то next
указывает на следующий элемент списка, а prev — на предшествующий. Если
prev{х}=nil, то у элемента х нет предшествующего: это голова (head) списка.
Если next{х}= nil, то х — последний элемент списка или, как говорят, его
хвост (tail).
Прежде чем двигаться по указателям, надо знать хотя бы один элемент списка. В различных ситуациях используются разные виды списков. В односторонне связанном (singly linked) списке отсутствуют поля prev. В упорядоченном (sorted) списке элементы расположены в порядке возрастания ключей, так что у головы списка ключ наименьший, а у хвоста списка — наибольший, в отличие от неупорядоченного (unsorted) списка. В кольцевом списке (circular list) поле prev головы списка указывает на хвост списка, а поле next хвоста списка указывает на голову списка.
Если иное не оговорено особо, под списком мы будем понимать неупорядоченный двусторонне связанный список.
Вместо того чтобы хранить список в последовательных ячейках памяти, можно использовать значительно более гибкую схему, в которой каждый узел содержит связь со следующим узлом списка.
Здесь А, В, С, D и Е— произвольные ячейки в памяти, а Л — пустая связь. Программа, в которой используется такая таблица, имела бы, в случае последовательного распределения, дополнительную переменную или константу, значение которой показывает, что таблица состоит из пяти элементов; эту же информацию можно задать с помощью признака конца ("пограничника"), снабдив им элемент 5 или следующую ячейку, В случае связанного распределения в программе имеется переменная связи или константа, которая указывает на А, а отправляясь от А, можно найти все другие элементы списка.
Cвязи часто изображаются просто стрелками, поскольку, как правило, безразлично, какую фактическую ячейку памяти занимает элемент. Поэтому приведенную выше связанную, таблицу можно изобразить следующим образом:
Здесь FIRST — переменная связи, указывающая на первый узел в списке.
Теперь мы можем сопоставить эти две основные формы хранения информации:
1) Связанное распределение требует дополнительного пространства в памяти для связей. В некоторых ситуациях этот фактор может быть доминирующим. Однако мы часто встречаемся с таким положением, когда информация в узле не занимает все слово целиком, и поэтому место для поля связи уже существует. Кроме того, во многих применениях несколько элементов можно объединять в один узел, и, следовательно, потребуется лишь одна связь ни несколько элементов информации. Но гораздо важнее тот факт, что при использовании связанной памяти часто возникает неявный выигрыш в памяти, поскольку можно совмещать общие части таблиц; и во многих Случаях последовательное распределение не будет столь эффективным, как связанное, если так или иначе не остается пустым довольно большое количество ячеек памяти.
2) Легко исключить элемент, находящийся внутри связанного списка.
Например, чтобы исключить элемент 3, нам необходимо только изменить связь в
элементе 2. При последовательном же распределении такое исключение обычно
потребует перемещения значительной части списка вверх на другие места
памяти.
3) Если используется связанная схема, то легко включить элемент в список. Например, чтобы включить элемент [pic] в (1), необходимо изменить лишь две связи:
Такая операция заняла бы значительное время при работе с длинной последовательной таблицей.
Рекомендуем скачать другие рефераты по теме: гигиена реферат, курсовик.
Категории:
Предыдущая страница реферата | 1 2 3 4 5 6 7 8 9 10 11 | Следующая страница реферата