Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

сиаод / 1-34 / 5. Стек. Указатели

.pdf
Скачиваний:
62
Добавлен:
11.05.2015
Размер:
261.12 Кб
Скачать

5. Стек. Абстрактный тип данных стек. Реализация стека с помощью указателей.

Стек("последний пришел – первым вышел")- линейный последовательный список, в котором доступ, включение и исключение элементов выполняется только с одного конца.

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

Операции:

1.создать стек

2.поместить элемент в стек

3.забрать элемент

4.получить значение верхнего элемента

5.проверить на пустоту

6.удалить.

Память для элемента списковой структуры выделяется в тот момент, когда этот элемент появляется во время выполнения программы, а не во время её компиляции.

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

Для организации и ведения стека должны быть предусмотрены два указателя:

TYPE pStack = ^StackNode StackNode = record

info : integer

next : pStackуказатель на предыдущий end

var Stack : pStackуказатель на вершину Инициализация:

Stack:=nil

Поместить первый э-нт в стек:

1.new(p); выделить память под элемент;

2.p^.info := 5; занести в неё нужную информацию

3.p^.next:=nil;

4.stack := p; указателю stack присвоить значение указателя;

Добавить эл-т в стек:

1.new (p); выделение памяти под новый элемент;

2.p^.info:=7; заполнить информ. часть;

3.p^.next := stack; указатель на вешину стека;

4.stack := p

Удалить эл-т из стека:

1.val := stack^.info считываем информацию эл-та;

2.p := stack указываем рабочий указатель на вершину стека;

3.stack := p^.next перемещаем стек к следующ. эл-ту;

4.dispose(p) освождаем память;

Формирование стека с самого начала. Стек из N элементов: stack := nil;

while n > 0 do begin new(k); read(val); p^.info := CH; p^.next := TOP; TOP := p;

n := n -1 end;

В динамических структурах снимается проблема переполнения стека. Выч. затраты постоянны O(1)-за одну итерацию:

1)обращение к диспетчеру динамической памяти(new(p))

2)занесение информации в выдел. объем памяти

3)занесение значения в указатели