Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia_Struktury_dannykh.docx
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
37.57 Кб
Скачать

Реализация стека

Для реализации стека резервируют подряд расположенные ячейки памяти. Размер свободной области памяти, выделенной для размещения стека, ограничивает его размеры (количество элементов, умноженное на размер каждого элемента, если они однотипны).

Начало области памяти (адрес ее первой ячейки) считается основанием стека. Добавляемые элементы размещаются друг за другом от основания к вершине, то есть от начала области и вплоть до ее конца (до области, занятой другими данными).

Полная система стека предполагает наличие процедур для записи и удаления элементов стека, а также для проверки перед этими операциями, не пуст ли стек или не наполнен ли он до конца области памяти.

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

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

Для того чтобы поместить в стек новую запись, указатель стека изменяется и указывает на свободное место над вершиной стека. Туда и помещается новая запись.

При считывании из стека указатель сначала указывает на вершину стека, а после считывания уменьшается и указывает на нижележащий еще не считанный элемент. Таким образом, считанный элемент стека более не доступен и не считается находящимся в стеке.

При обращении к стеку, программа обращается в ячейку памяти, где хранится указатель на стек. Указатель содержит адрес первой ячейки стека (адрес его вершины).

Очереди

В очередь данные добавляются в хвост очереди, а считываются из ее головы. Соответственно, у очереди два указателя, один из которых содержит адрес головы (для обращения к очереди с целью считывания), а другой указатель содержит адрес хвоста (для записи).

Очередь пуста, если оба указателя указывают на одно и то же место в памяти (причем оно на самом деле еще ничего не содержит).

После записи в хвост первого элемента, указатель хвоста изменяется и указывает на место позади последнего элемента, то есть на свободное место для записи, которое и называется хвостом очереди.

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

Реализация очереди

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

В случае, если достигнут конец области памяти, то указателю хвоста передается адрес начала области памяти, то есть очередь ползает как бы по кругу. Если же при этом хвост догонит голову, то есть если в очередь много элементов добавлено, но мало считано, то возникает необходимость выделить новую область памяти и поместить указатель на ее начало в хвост очереди, после чего передать адрес ее начала указателю хвоста. Тогда очередь вползет хвостом вперед в новую область памяти.

Голова очереди когда-нибудь достигнет этого указателя, он будет считан и это будет признаком того, что прежняя область памяти свободна. Тогда, если очередь в новой области памяти столкнется с проблемой переполнения, то есть опять хвост догонит голову, то она поползет в старую область памяти.

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

Образуется область памяти, где хранятся подряд эти указатели. Таким образом, очередь характеризуется массивом указателей.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]