- •Технология программирования (pascal)
- •V. Структуры и организация данных
- •2. Динамические структуры данных
- •2.5. Линейные списки.
- •1. Получение доступа к k-му элементу списка для считывания и/или изменения его значения:
- •2. Вставка нового элемента списка после k-го элемента:
- •3. Удаление k-го элемента списка:
- •2.6. Циклические (кольцевые) списки.
- •Пример программы работы с двусвязным циклическим списком
- •3. Организация данных
- •3.1. Организация данных – стек.
- •Основные операции над стеком и описательные алгоритмы реализации некоторых из них
- •1. Создание элемента стека:
- •2. Добавление элемента в стек:
- •3. Удаление элемента из стека:
- •1. Стек как механизм реализации вложенности.
- •Пример подпрограмм, реализующих стек
- •3.2. Организация данных – очередь. Простая очередь
- •Дек (двусторонняя очередь)
- •Очереди с ограниченным входом и с ограниченным выходом
Основные операции над стеком и описательные алгоритмы реализации некоторых из них
К базисным операциям над стеком относятся: создание пустого стека; проверка стека на пустоту; добавление элемента в стек; удаление элемента из стека; извлечение данных, начиная с последнего элемента стека.
1. Создание элемента стека:
-
выделение памяти под первый элемент стека и внесение в него информации;
-
установка вершины стека Тор на созданный элемент.
2. Добавление элемента в стек:
-
выделение памяти под новый элемент;
-
внесение значения в информационное поле нового элемента и установка связи между ним и старой вершиной стека Тор;
-
установка вершины стека Тор на новый элемент.
При добавлении элемента в стек указатель вершины стека перемещается на новый элемент, а в ссылочное поле нового элемента заносится адрес прежней вершины, поэтому проход по элементам стека возможен только от вершины, т. е. от последнего элемента, к первому.
3. Удаление элемента из стека:
-
извлечение информации из информационного поля вершины стека Тор в переменную и установка на вершину стека вспомогательного указателя Р;
-
перемещение указателя вершины стека Тор на следующий элемент и освобождение памяти, занимаемой старой вершиной стека.
При удалении элемента из стека удаляется последний элемент из памяти, а указатель вершины перемещается к следующему (предпоследнему) элементу.
Свойства стека и его практическое применение.
1. Стек как механизм реализации вложенности.
-
Стек используется при реализации последовательности вложенных вызовов подпрограмм, т. е. когда одна подпрограмма вызывает другую или саму себя. При вызове подпрограммы адрес возврата (адрес следующей за вызовом команды) запоминается в стеке, и таким образом, при выполнении последовательности вложенных вызовов в стеке создается история вызовов подпрограмм, которая может быть восстановлена в обратном порядке при завершении работы подпрограмм (большинство трансляторов используют стек для реализации механизма вызова подпрограмм).
-
Трансляторы также используют стеки при разборе арифметических выражений и вложенных друг в друга конструкций языка. При синтаксическом анализе вложенных друг в друга конструкций языка трансляторы используют магазинные (стековые) автоматы (стек при этом содержит не до конца проанализированные конструкции языка).
2. Свойство стека – относительная адресация его элементов: для элемента, сохраненного в стеке, важно не его абсолютное положение в последовательности (массиве), а положение относительно вершины стека или его указателя.
Пример подпрограмм, реализующих стек
Unit type_st; { модуль описания типов }
Interface
type
point=^element;
element=record
data: string;
next: point;
end;
Implementation
end.
Unit work_st; { модуль процедур, реализующих работу со стеком }
Interface
uses crt, type_st;
procedure Output( pcur: point); { просмотр элементов стека }
procedure Push(var pcur: point; s: string); { добавление элемента в стек }
procedure Pop(var pcur: point; var s: string); { удаление элемента из стека }
Implementation
procedure Output; { просмотр элементов стека }
var
p: point;
begin
clrscr;
p:=pcur;
repeat
write(p^.data,' ');
p:=p^.next;
until p=nil;
end;
procedure Push; { добавление элемента в стек }
var
p: point;
begin
new(p);
p^.data:=s;
p^.next:=pcur;
pcur:=p;
end;
procedure Pop; { удаление элемента из стека }
var
p: point;
begin
if pcur<>nil then
begin
p:=pcur;
s:=p^.data;
pcur:=p^.next;
dispose( p);
end;
end;
end.