![](/user_photo/2706_HbeT2.jpg)
- •Программирование и алгоритмические языки. Курс за второй семестр. Абстрактные типы данных.
- •Задача о раскраске.
- •Перечисление последовательностей фиксированной длины.
- •Var I:tСтраны; c:tЦвет;
- •Два взгляда на диаграммы – графы и автоматы.
- •Деревья
- •Как сократить перебор с возвратом. Перечисление последовательностей переменной длины
- •Словарный порядок на последовательностях произвольной длины
- •Статическая реализация стеков.
- •Очереди. Статическая реализация.
- •Статическая реализация деревьев.
- •Автоматы как структуры данных
- •Статическая реализация графов. Проблема фрагментации памяти. Списочные структуры.
- •Общая схема реализации автомата как списка.
- •Обработка кучи.
- •Динамическая реализация абстрактных типов ссылками. Ссылочные типы Паскаля.
- •Ссылочные типы Паскаля. Синтаксис типов.
- •Объявление списочной структуры в Паскале.
- •Реализация стеков.
- •Реализация очередей.
- •Основные операции над списками.
- •Обработка деревьев. Деревья выражений.
- •Поиск атома.
- •Различные объединения типов. Записи типов с вариантами.
- •Создание дерева. Перевод из префиксной записи. Представление записи.
- •Анализ алгоритма вычисления. Дерево как последовательность ветвей.
- •Задача синтаксического анализа.
- •Графы-выражения.
- •Раздельное описание абстрактных типов. Модульное программирование.
- •Проблема с кратным использованием модулей.
- •Деревья как структуры данных.
- •Деревья поиска.
- •Поиск в дереве поиска.
- •Включение в дерево поиска.
- •Другие обходы дерева. Обход в ширину.
- •Рекурсивные процедуры и функции. Примеры применения.
- •Поиск в дереве.
- •Проблемы с семантикой рекурсии.
- •Введение в машинно-ориентированное (ссылочное) программирование. Оператор Goto.
- •Создание новых структурных операторов.
- •Формальная семантика goto и неструктурных программ.
- •Мини-Паскаль.
- •Представление сложных типов. Адресная арифметика.
- •Проблемы реализации ввода-вывода. Идея буферизации.
- •Реализация процедур read и write.
- •Реализация структур управления.
- •Путь наверх. Реализация процедур-подпрограмм.
- •Передача параметров.
- •Сохранение и восстановление значений. Соглашение о связях.
- •Введение в теоретическое программирование. Границы программирования. Принципиальная и практическая неразрешимость.
- •О формальной спецификации. Мир задачи как автомат.
- •Процедуры как функции на множестве состояний. Процедуры как преобразователи предикатов.
- •Универсальные методы решения задач.
Объявление списочной структуры в Паскале.
Type T={базовый тип, компонента списка}
component=record
info:T;
next:^component;
end;
Определение такого типа недопустимо в синтаксисе Паскаля, но возможно описание следующего вида:
type T={ };
pComponent=^tComponent;
tComponent=record
info:T;
next:pComponent;
end;
Базовое правило «тип можно определять лишь в терминах уже описанных типов» имеет единственное исключение – ссылку на тип можно определять раньше, чем сам тип. Это единственная форма рекурсивного определения, допустимая в Паскале.
Реализация стеков.
Procedure Push(top:pComponent;x:T);
{Стек задаётся списком, top, в свою очередь, - ссылкой на первый элемент (голову списка)}
top
nil
var p:pComponent;
begin
new(p);
p^.info:=x;
top:=p;
end;
procedure Pop(var top:pComponent;var x:T);
var p:pComponent;
begin
p:=top;
x:=top^.info;
top:=top^.next;
dispose(p);
end;
function Empty(top:pComponent):boolean;
begin
empty:=top=nil;
end;
{Соответствует инициализации в случае, когда стек ещё не существует и уже существует}
procedure Create(var top:pComponent);
{Создать пустой стек}
begin
top:=nil;
end;
procedure Destroy(var top:pComponent);
begin
while top<>nil do
begin
p:=top^.next;
dispose(top);
top:=p;
end;
end;
Реализация очередей.
{Дан член последовательности, который надо исключить и сама последовательность}
procedure Put(a:T;с:pComponent);
var p:pComponent;
begin
new(p);
p^.info:=a;
p^.next:=nil;
c^.next:=p;
с:=p;
end;
procedure Create(b,c:pComponent);
{Указатели на начало и конец очереди}
var p:pComponent;
begin
new(p);
p^.info:=zero; {zero=const – нулевой элемент}
p^.next:=nil;
b:=p;
c:=p;
end;
procedure Get(a:T;var b:pComponent);
{Ссылка на «болванчик»}
var first:pComponent;
{Ссылка на первый элемент}
begin
first:=b^.next; {по моему здесь должно быть b, т.е. first:=b}
a:=first^.info;
b^.next:=first^.next;{b:=first^.next}
dispose(first);
end;
function Empty(b:pComponent):boolean;
begin
empty:=b^.next=nil;
end;
Основные операции над списками.
Операции:
-
Конкатенация списка;
-
Вставка компоненты после, до или вместо заданной;
-
Выделение подсписка.
Во всех случаях списки задаются ссылкой на начало и конец.
firsta lasta
firstb
lastb
concat
lasta^.next:=firstb;
Вставка после:
firsta vstavka lasta
firstb lastb
lastb^.next:=vstavka^.next;
vstavka^.next:=firstb;
Вставка
до:
lastb^.next:=vstavka^.next;
vstavka^.next:=firstb^.next;
x:=vstavka^.info; вставка вместо
vstavka^.info:=firstb^.info;
firstb^.info:=x;
firstb^.next:=lastb^.next;
lastb^.next:=firstb;
Упражнение. Выделение и включение подсписка, если задана ссылка на конец подсписка и
а) голову (первый компонент);
б) стоящий перед ним.
В этих задачах удобнее считать, что у каждой компоненты, хранящей члены последовательности, есть следующая и предыдущая.