- •1.Этапы разработки компьютерной программы.
- •2.Алгоритмы и их свойства.
- •3.Формы существования алгоритмов; Блок-схемы; Примеры записи алгоритма в виде блок схемы.
- •4.Классификация алгоритмических языков.
- •5.Понятие структурного программирования.
- •6.Характеристика алгоритмического языка Паскаль.
- •7.Элементы языка Паскаль (алфавит, индентификаторы, константы, выражения, операции).
- •8.Структура программ, при использовании для разработки программы алгоритмического языка Паскаль.
- •9.Операторы Паскаля.
- •1. Составной и пустой операторы
- •2. Операторы ветвлений
- •3. Операторы повторений
- •10.Ввод и вывод данных в Паскале.
- •11.Операторы Паскаля: составной оператор и пустой оператор.
- •12. Операторы Паскаля: условный оператор.
- •13. Операторы Паскаля: операторы повторений.
- •14. Операторы Паскаля: операторы цикла с предусловием.
- •16. Операторы Паскаля: оператор цикла с постусловием (repeat… until).
- •17.Операторы Паскаля: оператор цикла с параметрами (for …to …do).
- •18. Операторы Паскаля: оператор безусловного перехода, метки. Оператор безусловного перехода goto
- •19.Подпрограммы в Паскале.
- •20.Процедуры в Паскале.
- •21.Функции в Паскале.
- •Описание и вызов процедур и функций
- •22.Типы данных в Паскале: простые типы.
- •23. Типы данных в Паскале: структурированные типы. Массивы.
- •24. Типы данных в Паскале: структурированные типы. Записи.
- •25. Типы данных в Паскале: структурированные типы. Множества.
- •26. Типы данных в Паскале: структурированные типы. Файлы (понятие файла, доступ к файлу, процедуры и функции для работы с файлами).
- •27. Типы данных в Паскале: структурированные типы. Файлы (текстовые, типизированные, нетипизированые).
- •28.Аппарат формальных и фактических параметров при работе с подпрограммами.
- •Назначение подпрограмм.
- •Механизм подпрограмм, их описание и вызов
- •Параметры подпрограмм ]Назначение параметров
- •[Править]Формальные и фактические параметры
- •[Править]Способ передачи параметров в подпрограмму
- •[Править]Виды подпрограмм
- •29.Массивы.
- •30.Сортировки массивов. Прямые методы сортировки.
- •31.Сортировка вставкой.
- •32.Сортировка массивов. Прямые методы сортировки.
- •33.Сортировка обменом.
- •34.Сортировка массивов. Прямые методы сортировки
- •35. Сортировка выбором.
- •36.Двоичный поиск в массиве.
- •37. Поиск данных в массиве по ключу.
- •38.Средства тп для работы с файлами.
- •39.Классификация структур данных в Паскале.
- •40.Данные статической структуры в Паскале.
- •41.Переменные строкового типа.
- •42.Динамические структуры данных в Паскале.
- •43.Динамическая память. Понятия адреса и указателя. Объявление указателей. Динамическая память
- •Адреса и указатели
- •Объявление указателей
- •44.Динамическая память. Выделение и освобождение динамической памяти.
- •45.Процедуры и функции для работы с динамической памятью.
- •46.Связанные динамические данные.
- •47. Связанные динамические данные: очередь.
- •Принципы работы с динамической очередью
- •48. Связанные динамические данные: стек.
- •Описание стека
- •Работа с динамическим стеком
- •49. Связанные динамические данные: списки. Динамические структуры данных
- •Классификация структур данных
- •Данные динамической структуры:
- •Статические и динамические переменные в Паскале
- •Указатели
- •Объявление указателей
- •Выделение и освобождение динамической памяти
- •Присваивание значений указателю
- •Операции с указателями
- •Присваивание значений динамическим переменным
- •Динамические структуры
- •Описание списка
- •Формирование списка
- •Просмотр списка
- •Удаление элемента из списка
- •Динамические объекты сложной структуры
- •50. Связанные динамические данные: деревья.
- •51.Понятие рекурсии, примеры рекурсивных алгоритмов.
48. Связанные динамические данные: стек.
Определение: Стек - это данные динамической структуры, которые представляют собой совокупность линейно-связанных однородных элементов, для которых разрешено добавлять или удалять элементы только с одного конца списка, который называется вершиной (головой) стека.
Стек функционирует по принципу LIFO (Last - In - First- Out ) - "последним пришел - первым исключается".
При записи и выборке изменяется только адрес вершины стека. Поэтому каждый стек имеет базовый адрес, от которого производятся все операции со стеком. В случае, когда стек пуст, адреса вершины и основания стека совпадают.
Стек является одной из наиболее часто употребляемых структур в программировании. Это определяется тем, что при работе со стеком нет необходимости прямо использовать адресацию памяти. Самым важным применением стека в программах является использование стека для хранения адресов возврата в программу из подпрограмм или из процедур обработки прерываний, а также передача через стек параметров в процедуры (функции), размещение в стеке локальных параметров процедур. Стеки используются в работе алгоритмов, имеющих рекурсивный характер.
Так как язык Pascal не имеет непосредственно типа данных стек, то для его моделирования наиболее подходящими структурами являются массивы (статический стек для моделирования структур заданного размера ) и динамический стек, при этом структура будет помещаться в динамической памяти, и её размер будет ограничен только размером кучи.
Условно стек можно представить в виде стакана с шариками.
Описание стека
Type Tptr=^TElem; {Тип указателя на элемент стека}
TElem = record {Тип элемента стека }
inf :integer; {информационная часть}
link : Tptr; {соединительная часть}
end;
Работа с динамическим стеком
Для работы со стеком необходимо иметь один основной указатель на вершину стека (возьмём идентификатор Top) и один дополнительный временный указатель (возьмём идентификатор P), который используется для выделения и освобождения из памяти элементов стека.
Создание стека.
Исходное состояние:
Выделение памяти под первый элемент стека и занесение в него информации:
Установка вершины стека Top на созданный элемент:
Добавление элемента стека.
Исходное состояние:
Выделение памяти под новый элемент стека. Внесение значения в информационное поле нового элемента и установка связи между ним и "старой" вершиной стека Top:
Перемещение вершины стека Top на новый элемент:
Удаление элемента стека.
Исходное состояние
Извлечение информации из информационного поля вершины стека Top в переменную Val и установка на вершину стека вспомогательного указателя P:
Перемещение указателя вершины стека Top на следующий элемент и освобождение памяти, занимаемой "старой" вершиной стека:
Пример 1. Разместить в стеке 10 символов и распечатать их в обратном порядке.
Hиже приводится пример программы, использующей стек. В ней используются следующие процедуры для работы со стеком:
процедура Push(val:real), которая в зависимости от состояния стека создаёт первый или добавляет очередной элемент в вершину стека (английское название push - заталкивать);
процедура Pop(var val:real), которая извлекает информацию из вершины стека с последующим освобождением её из памяти (английское название pop - выскакивать ).
Program Stack;
Type Tptr = ^TElem; {Тип указателя на элемент стека}
TElem = record {Тип элемента стека}
inf : char; {информационная часть}
link : Tptr; {соединительная часть}
end;
Var top : tptr; {Указатели на конец стека}
value : char;
i: byte;
Procedure Push(val : char; var Top:Tptr); {Процедура добавления элемента}
Var p : tptr; {Вспомогательный указатель}
Begin
new (p);
p^.inf:=val;
p^.link:=top;
top:=p
End;
Procedure Pop(var val : char; var Top:Tptr); {Процедура удаления элемента}
Var p : tptr; {Вспомогательный указатель}
Begin
val:=top^.inf;
p:=top;
top:=p^.link;
dispose (p)
End;
Begin
new(top); { Создание указателя на вершину стека }
top:=nil;
for i:=1 to 10 do
begin
writeln (' введите символ');
readln (value);
push(value,Top); {добавление элемента в стек}
end;
i:=10;
while top<>nil do {пока не будет достигнут конец стека}
begin
pop(value, Top); {извлечение элемента из стека}
writeln (i,'-й символ - ',value);
dec (i)
end
End.
Пример 2. Ввести с клавиатуры 8 чисел и сформировать из них два стека. В первый поместить числа, которые делятся на 2, а во второй -остальные. Распечатать оба стека.
Type Tptr=^TElem; {Тип указателя на элемент стека}
TElem = record {Тип элемента стека }
inf :integer; {информационная часть}
link : Tptr; {соединительная часть}
end;
Var top1,top2 : tptr; {Указатели на конец стеков}
value : integer;
i: byte;
Procedure Push(val : integer; var top:tptr); {Процедура добавления элемента}
Var p :tptr; {Вспомогательный указатель}
Begin
new (p);
p^.inf:=val;
p^.link:=top;
top:=p
End;
Procedure Pop(var val : integer; var top:tptr); {Процедура удаления элемента}
Var p : tptr; {Вспомогательный указатель}
Begin
val:=top^.inf; p:=top;
top:=p^.link; dispose (p)
End;
Begin
new (top1); {Создание указателя на вершину 1-го стека }
new (top2); { Создание указателя на вершину 2-го стека }
top1:=nil; top2:=nil;
for i:=1 to 8 do
begin
writeln (' введите число'); readln (value);
if value mod 2 =0 then
push(value,top1)
else
push(value,top2)
end;
writeln (' 1-й стек - числа делятся на 2 ');
while top1<>nil do
begin
pop(value,top1);
writeln (value);
end;
writeln (' 2-й стек - - числа не делятся на 2');
while top2<>nil do
begin
pop(value,top2);
writeln (value);
end
End.
Задание. Проверить в выражении баланс открывающихся "(" и закрывающихся ")" скобок.
Идея алгоритма заключается в следующем. Если встречается открывающаяся скобка, то в стек помещают какой-либо символ. Если встречается закрывающаяся скобка, то проверяют состояние стека. При этом возможны следующие ситуации:
стек непуст: из стека извлекают один элемент;
стек пуст, это свидетельствует о том, что закрывающихся скобок больше чем открывающихся.
После того, как просмотрена вся строка символов, необходимо проверить состояние стека. Если он пуст, то баланс скобок не нарушен. В противном случае - баланса нет.