Collections — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Saatchi (обсуждение | вклад) (→Collections) |
Juliet (обсуждение | вклад) |
||
Строка 70: | Строка 70: | ||
prev := pPrev; | prev := pPrev; | ||
end; | end; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end. | end. | ||
Строка 750: | Строка 75: | ||
== Collections == | == Collections == | ||
− | <xh4> Интерфейс </xh4> | + | <!-- <xh4> Интерфейс </xh4> |
'''''<font size=2>Stack</font>''''' | '''''<font size=2>Stack</font>''''' | ||
'''Create''' | '''Create''' | ||
Строка 856: | Строка 181: | ||
'''PrintlnReverse''' | '''PrintlnReverse''' | ||
− | Выводит содержимое массива в прямом порядке в каждой строке | + | Выводит содержимое массива в прямом порядке в каждой строке --> |
<xh4> Реализация </xh4> | <xh4> Реализация </xh4> | ||
Строка 864: | Строка 189: | ||
/// Queue — очередь | /// Queue — очередь | ||
/// DynArray — динамический массив с автоконтролем памяти | /// DynArray — динамический массив с автоконтролем памяти | ||
+ | /// SimpleSet — простое множество (с минимальным набором операций) | ||
+ | /// AssocArray — ассоциативный массив | ||
unit Collections; | unit Collections; | ||
− | |||
interface | interface | ||
Строка 871: | Строка 197: | ||
uses Nodes; // для использования типа SingleNode<DataType> — | uses Nodes; // для использования типа SingleNode<DataType> — | ||
// узла с одним полем связи | // узла с одним полем связи | ||
+ | |||
− | + | // --------------------------------------------- STACK -------------------------------------------- | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
type | type | ||
/// Шаблон класса Stack [Стек] | /// Шаблон класса Stack [Стек] | ||
Строка 892: | Строка 205: | ||
private | private | ||
/// Вершина стека | /// Вершина стека | ||
− | fTop: SingleNode<DataType> := nil; | + | fTop: SingleNode<DataType> := nil; |
public | public | ||
Строка 898: | Строка 211: | ||
/// Создает пустой стек | /// Создает пустой стек | ||
constructor Create; | constructor Create; | ||
− | |||
− | |||
− | /// Кладет элемент | + | /// <summary> |
+ | /// Кладет элемент на вершину стека | ||
+ | /// </summary> | ||
+ | /// <param name="x">Новый элемент</param> | ||
procedure Push(x: DataType); | procedure Push(x: DataType); | ||
− | /// Возвращает | + | /// Возвращает значение элемента на вершине, снимая его с вершины стека |
function Pop: DataType; | function Pop: DataType; | ||
− | /// Возвращает значение элемента на вершине стека | + | /// Возвращает значение элемента на вершине стека, не снимая его |
function Top: DataType; | function Top: DataType; | ||
/// Возвращает истину, если стек пуст | /// Возвращает истину, если стек пуст | ||
− | function IsEmpty: boolean; | + | function IsEmpty: boolean; |
− | // ----------------------------- Вывод | + | // ---------------------------------- Вывод ---------------------------------- |
− | + | /// Выводит содержимое стека на консоль | |
− | /// Выводит | + | procedure Println(); |
− | |||
− | |||
− | |||
− | procedure | ||
− | |||
− | |||
end; | end; | ||
− | + | // --------------------------------------------- QUEUE -------------------------------------------- | |
− | // | ||
− | |||
− | |||
− | |||
− | |||
type | type | ||
/// Шаблон класса Queue [Очередь] | /// Шаблон класса Queue [Очередь] | ||
Строка 941: | Строка 244: | ||
/// Создает пустую очередь | /// Создает пустую очередь | ||
constructor Create; | constructor Create; | ||
− | |||
− | |||
− | |||
− | /// Добавляет элемент | + | /// <summary> |
+ | /// Добавляет элемент в хвост очереди | ||
+ | /// </summary> | ||
+ | /// <param name="x">Добавляемый элемент</param> | ||
procedure Enqueue(x: DataType); | procedure Enqueue(x: DataType); | ||
− | + | /// Возвращает значение элемента в голове, убирая его из головы очереди | |
− | /// Возвращает | ||
function Dequeue: DataType; | function Dequeue: DataType; | ||
− | + | /// Возвращает значение элемента в голове очереди, не убирая его | |
− | /// Возвращает значение | + | function Top: DataType; |
− | function Top: DataType; | ||
/// Возвращает истину, если очередь пуста | /// Возвращает истину, если очередь пуста | ||
function IsEmpty: boolean; | function IsEmpty: boolean; | ||
− | + | ||
− | // ----------------------------- Вывод | + | // ---------------------------------- Вывод ---------------------------------- |
− | + | /// Выводит содержимое очереди на консоль | |
− | /// Выводит | + | procedure Println(); |
− | |||
− | |||
− | |||
− | procedure | ||
− | |||
− | |||
end; | end; | ||
− | + | // ------------------------------------------- DYN_ARRAY ------------------------------------------ | |
− | // | ||
const | const | ||
/// Минимальная емкость, устанавливаемая при создании массива | /// Минимальная емкость, устанавливаемая при создании массива | ||
Строка 997: | Строка 291: | ||
/// Создает массив размера pSize | /// Создает массив размера pSize | ||
constructor Create(pSize: integer := 0); | constructor Create(pSize: integer := 0); | ||
− | |||
− | |||
− | |||
− | /// Выделяет новую память. Емкость увеличивается | + | /// <summary> |
− | /// (Если newCap меньше текущей емкости, ничего не происходит) | + | /// Выделяет новую память. Емкость увеличивается. |
+ | /// (Если newCap меньше текущей емкости, ничего не происходит) | ||
+ | /// </summary> | ||
+ | /// <param name="newCap">Новая емкость массива</param> | ||
procedure Reserve(newCap: integer); | procedure Reserve(newCap: integer); | ||
− | + | /// <summary> | |
− | /// Устанавливает размер массива | + | /// Устанавливает новый размер массива |
+ | /// </summary> | ||
+ | /// <param name="newSize">Новый размер массива</param> | ||
procedure Resize(newSize: integer); | procedure Resize(newSize: integer); | ||
− | /// Добавляет | + | /// <summary> |
+ | /// Добавляет элемент в конец массива | ||
+ | /// </summary> | ||
+ | /// <param name="x">Добавляемый элемент</param> | ||
procedure Add(x: DataType); | procedure Add(x: DataType); | ||
− | + | /// <summary> | |
− | /// | + | /// Вставляет элемент в указанную позицию |
− | + | /// </summary> | |
− | + | /// <param name="pos">Позиция, в которую вставляется элемент</param> | |
− | /// | + | /// <param name="x">Вставляемый элемент</param> |
− | /// | + | procedure Insert(pos: integer; x: DataType); |
− | procedure Insert(pos: integer; | + | /// <summary> |
− | + | /// Удаляет элемент массива из указанной позиции | |
− | /// Удаляет | + | /// </summary> |
− | /// | + | /// <param name="pos">Позиция, из которой удаляется элемент</param> |
− | procedure Delete(pos: integer | + | procedure Delete(pos: integer); |
− | /// Возвращает индекс первого элемента массива равного | + | /// <summary> |
+ | /// Возвращает индекс первого элемента массива равного искомому | ||
/// или -1, если такого элемента нет | /// или -1, если такого элемента нет | ||
+ | /// </summary> | ||
+ | /// <param name="x">Искомый элемент</param> | ||
function Find(x: DataType): integer; | function Find(x: DataType): integer; | ||
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
// --------------------------------- Свойства -------------------------------- | // --------------------------------- Свойства -------------------------------- | ||
/// Количество элементов (размер) массива | /// Количество элементов (размер) массива | ||
Строка 1036: | Строка 333: | ||
/// Емкость массива (отведенная память) | /// Емкость массива (отведенная память) | ||
property Capacity: integer read cap write Reserve; | property Capacity: integer read cap write Reserve; | ||
+ | |||
/// Позволяет обращаться к элементам массива по индексу | /// Позволяет обращаться к элементам массива по индексу | ||
/// (например, apples[5]) | /// (например, apples[5]) | ||
property Elem[index: integer]: DataType read GetElem write SetElem; default; | property Elem[index: integer]: DataType read GetElem write SetElem; default; | ||
− | // ----------------------------- Вывод | + | |
− | + | // ---------------------------------- Вывод ---------------------------------- | |
− | /// Выводит содержимое массива | + | /// Выводит содержимое массива на консоль |
− | + | procedure Println(); | |
− | + | /// Выводит содержимое массива в обратном порядке на консоль | |
− | + | procedure PrintlnReverse(); | |
− | procedure | ||
− | |||
− | /// Выводит содержимое массива в обратном порядке | ||
− | |||
− | |||
− | |||
− | procedure | ||
− | |||
− | |||
− | |||
− | |||
end; | end; | ||
− | + | ||
− | + | // ------------------------------------------- SIMPLE_SET ----------------------------------------- | |
− | // ------------------------------------------- | + | type |
− | type SimpleSet<DataType> = class | + | /// Шаблон класса SimpleSet [Простое множество] |
+ | SimpleSet<DataType> = class | ||
private | private | ||
− | data:=new DynArray<DataType>; | + | /// Элементы множества |
+ | data := new DynArray<DataType>; | ||
+ | |||
public | public | ||
/// <summary> | /// <summary> | ||
Строка 1068: | Строка 358: | ||
/// </summary> | /// </summary> | ||
/// <param name="x">Добавляемый элемент</param> | /// <param name="x">Добавляемый элемент</param> | ||
− | procedure Add(x:DataType); | + | procedure Add(x: DataType); |
− | |||
/// <summary> | /// <summary> | ||
/// Удаляет элемент из множества | /// Удаляет элемент из множества | ||
/// </summary> | /// </summary> | ||
/// <param name="x">Удаляемый элемент</param> | /// <param name="x">Удаляемый элемент</param> | ||
− | procedure Remove(x:DataType); | + | procedure Remove(x: DataType); |
− | + | ||
/// <summary> | /// <summary> | ||
− | /// | + | /// Возвращает истину, если множество содержит элемент |
/// </summary> | /// </summary> | ||
/// <param name="x">Искомый элемент</param> | /// <param name="x">Искомый элемент</param> | ||
− | function Contains(x:DataType):boolean; | + | function Contains(x: DataType): boolean; |
− | |||
− | |||
− | |||
+ | // ---------------------------------- Вывод ---------------------------------- | ||
///Выводит содержимое множества на консоль | ///Выводит содержимое множества на консоль | ||
procedure Println(); | procedure Println(); | ||
end; | end; | ||
− | + | ||
− | + | // ------------------------------------------- ASSOC_ARRAY ---------------------------------------- | |
− | + | type | |
− | + | /// Шаблон класса AssocArray [Ассоциативный массив] | |
− | + | AssocArray<KeyType, ValueType> = class | |
− | + | private | |
+ | /// Ключи | ||
+ | keys: DynArray<KeyType> := new DynArray<KeyType>; | ||
+ | /// Значения соответствующих ключей | ||
+ | values: DynArray<ValueType> := new DynArray<ValueType>; | ||
+ | |||
+ | /// Устанавливает значение элемента с ключом key равным value | ||
+ | procedure SetElem(key: KeyType; value: ValueType); | ||
+ | /// Возвращает значение элемента с ключом key | ||
+ | function GetElem(key: KeyType): ValueType; | ||
+ | |||
+ | public | ||
+ | // --------------------------------- Свойства -------------------------------- | ||
+ | /// Позволяет обращаться к элементам массива по ключу | ||
+ | /// (Например, zoo['крокодил']) | ||
+ | property Elem[key: KeyType]: ValueType read GetElem write SetElem; default; | ||
+ | end; | ||
+ | |||
+ | |||
// ================================================================= IMPLEMENTATION =================================================================== | // ================================================================= IMPLEMENTATION =================================================================== | ||
implementation | implementation | ||
− | + | // --------------------------------------------- STACK -------------------------------------------- | |
− | // | + | |
− | |||
// ---------------------------- Стандартные методы --------------------------- | // ---------------------------- Стандартные методы --------------------------- | ||
− | { | + | {Создает пустой стек} |
constructor Stack<DataType>.Create; | constructor Stack<DataType>.Create; | ||
begin | begin | ||
Строка 1108: | Строка 412: | ||
end; | end; | ||
− | + | {Кладет x элемент на вершину стека} | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | {Кладет элемент | ||
procedure Stack<DataType>.Push(x: DataType); | procedure Stack<DataType>.Push(x: DataType); | ||
begin | begin | ||
Строка 1122: | Строка 418: | ||
end; | end; | ||
− | {Возвращает | + | {Возвращает значение элемента на вершине, снимая его с вершины стека} |
function Stack<DataType>.Pop: DataType; | function Stack<DataType>.Pop: DataType; | ||
begin | begin | ||
if IsEmpty then | if IsEmpty then | ||
raise new Exception('Попытка снятия элемента с пустого стека!'); | raise new Exception('Попытка снятия элемента с пустого стека!'); | ||
+ | |||
result := fTop.data; | result := fTop.data; | ||
fTop := fTop.next; // элемент снимается с вершины стека | fTop := fTop.next; // элемент снимается с вершины стека | ||
Строка 1132: | Строка 429: | ||
end; | end; | ||
− | {Возвращает значение элемента на вершине стека} | + | {Возвращает значение элемента на вершине стека, не снимая его} |
function Stack<DataType>.Top: DataType; | function Stack<DataType>.Top: DataType; | ||
begin | begin | ||
if IsEmpty then | if IsEmpty then | ||
raise new Exception('Попытка получения элемента с пустого стека!'); | raise new Exception('Попытка получения элемента с пустого стека!'); | ||
+ | |||
result := fTop.data; | result := fTop.data; | ||
end; | end; | ||
Строка 1146: | Строка 444: | ||
end; | end; | ||
− | // ----------------------------- Вывод | + | // ---------------------------------- Вывод ---------------------------------- |
− | {Выводит | + | {Выводит содержимое стека на консоль} |
− | + | procedure Stack<DataType>.Println(); | |
− | |||
− | procedure Stack<DataType>. | ||
begin | begin | ||
− | if IsEmpty then | + | if not IsEmpty then |
− | |||
− | |||
begin | begin | ||
− | |||
− | |||
var curElem := fTop; | var curElem := fTop; | ||
+ | |||
while curElem <> nil do | while curElem <> nil do | ||
begin | begin | ||
− | + | write(curElem.data, ' '); | |
− | |||
− | |||
− | |||
− | |||
curElem := curElem.next; | curElem := curElem.next; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end; | end; | ||
end; | end; | ||
+ | writeln(); | ||
end; | end; | ||
+ | |||
− | + | // --------------------------------------------- QUEUE -------------------------------------------- | |
− | |||
− | // | ||
// ---------------------------- Стандартные методы --------------------------- | // ---------------------------- Стандартные методы --------------------------- | ||
Строка 1200: | Строка 472: | ||
end; | end; | ||
− | + | {Добавляет элемент ч в хвост очереди} | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | {Добавляет элемент | ||
procedure Queue<DataType>.Enqueue(x: DataType); | procedure Queue<DataType>.Enqueue(x: DataType); | ||
begin | begin | ||
Строка 1217: | Строка 480: | ||
tail := head; | tail := head; | ||
end | end | ||
− | else | + | else |
begin | begin | ||
tail.next := new SingleNode<DataType>(x, nil); | tail.next := new SingleNode<DataType>(x, nil); | ||
Строка 1225: | Строка 488: | ||
end; | end; | ||
− | {Возвращает | + | {Возвращает значение элемента в голове, убирая его из головы очереди} |
function Queue<DataType>.Dequeue: DataType; | function Queue<DataType>.Dequeue: DataType; | ||
begin | begin | ||
if IsEmpty then | if IsEmpty then | ||
raise new Exception('Попытка удаления элемента из пустой очереди!'); | raise new Exception('Попытка удаления элемента из пустой очереди!'); | ||
+ | |||
result := head.data; | result := head.data; | ||
− | |||
head := head.next; // элемент убирается из головы очереди | head := head.next; // элемент убирается из головы очереди | ||
// (т.е. головой становится следующий элемент) | // (т.е. головой становится следующий элемент) | ||
Строка 1237: | Строка 500: | ||
tail := nil; | tail := nil; | ||
end; | end; | ||
− | + | ||
− | {Возвращает | + | {Возвращает значение элемента в голове очереди, не убирая его} |
function Queue<DataType>.Top: DataType; | function Queue<DataType>.Top: DataType; | ||
begin | begin | ||
if IsEmpty then | if IsEmpty then | ||
raise new Exception('Попытка получения элемента из пустой очереди!'); | raise new Exception('Попытка получения элемента из пустой очереди!'); | ||
+ | |||
result := head.data; | result := head.data; | ||
end; | end; | ||
− | + | ||
{Возвращает истину, если очередь пуста} | {Возвращает истину, если очередь пуста} | ||
function Queue<DataType>.IsEmpty: boolean; | function Queue<DataType>.IsEmpty: boolean; | ||
Строка 1254: | Строка 518: | ||
end; | end; | ||
− | // ----------------------------- Вывод | + | // ---------------------------------- Вывод ---------------------------------- |
− | {Выводит | + | {Выводит содержимое очереди на консоль} |
− | + | procedure Queue<DataType>.Println(); | |
− | |||
− | procedure Queue<DataType>. | ||
begin | begin | ||
− | if IsEmpty then | + | if not IsEmpty then |
− | |||
− | |||
begin | begin | ||
− | |||
− | |||
var curElem := head; | var curElem := head; | ||
+ | |||
while curElem <> nil do | while curElem <> nil do | ||
begin | begin | ||
− | + | write(curElem.data, ' '); | |
− | |||
− | |||
− | |||
− | |||
curElem := curElem.next; | curElem := curElem.next; | ||
− | |||
end; | end; | ||
end; | end; | ||
+ | writeln(); | ||
end; | end; | ||
− | + | ||
− | + | // -------------------------------------------DYN_ARRAY ------------------------------------------ | |
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | // | ||
− | |||
// ---------------------------- Стандартные методы --------------------------- | // ---------------------------- Стандартные методы --------------------------- | ||
{Создает массив размера pSize} | {Создает массив размера pSize} | ||
Строка 1309: | Строка 547: | ||
end; | end; | ||
− | + | {Выделяет новую память. Емкость увеличивается до newCap. | |
− | + | (Если newCap меньше текущей емкости, ничего не происходит) } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | {Выделяет новую память. Емкость увеличивается до newCap | ||
− | (Если newCap меньше текущей емкости, ничего не происходит)} | ||
procedure DynArray<DataType>.Reserve(newCap: integer); | procedure DynArray<DataType>.Reserve(newCap: integer); | ||
begin | begin | ||
Строка 1329: | Строка 558: | ||
end; | end; | ||
− | {Устанавливает размер массива равным newSize} | + | {Устанавливает новый размер массива равным newSize} |
procedure DynArray<DataType>.Resize(newSize: integer); | procedure DynArray<DataType>.Resize(newSize: integer); | ||
begin | begin | ||
− | if newSize | + | if newSize > cap then |
− | |||
− | |||
begin | begin | ||
Reserve(INC_CAP_FACTOR * newSize); | Reserve(INC_CAP_FACTOR * newSize); | ||
for var i := size to newSize - 1 do // явным образом заполняем новые элементы | for var i := size to newSize - 1 do // явным образом заполняем новые элементы | ||
data[i] := default(DataType); | data[i] := default(DataType); | ||
− | |||
end; | end; | ||
+ | size := newSize; | ||
end; | end; | ||
− | {Добавляет элемент в конец массива} | + | {Добавляет элемент x в конец массива } |
procedure DynArray<DataType>.Add(x: DataType); | procedure DynArray<DataType>.Add(x: DataType); | ||
begin | begin | ||
Строка 1350: | Строка 577: | ||
end; | end; | ||
− | + | {Вставляет x элемент в позицию pos} | |
− | + | procedure DynArray<DataType>.Insert(pos: integer; x: DataType); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | {Вставляет в | ||
− | |||
− | procedure DynArray<DataType>.Insert(pos: integer; | ||
begin | begin | ||
if (pos < 0) or (pos > size-1) then | if (pos < 0) or (pos > size-1) then | ||
− | raise new Exception('Попытка вставки за границей массива в позицию ' + IntToStr(pos) + ' !'); | + | raise new Exception( |
− | Resize(size + | + | 'Попытка вставки за границей массива в позицию ' + IntToStr(pos) + '!'); |
− | for var i := size - 2 downto pos | + | |
− | data[i+1] := data[i | + | Resize(size + 1); |
− | + | for var i := size - 2 downto pos do | |
− | + | data[i+1] := data[i]; | |
+ | data[pos] := x; | ||
end; | end; | ||
− | {Удаляет | + | {Удаляет элемент массива из позиции pos} |
− | + | procedure DynArray<DataType>.Delete(pos: integer); | |
− | procedure DynArray<DataType>.Delete(pos | ||
begin | begin | ||
if (pos < 0) or (pos > size-1) then | if (pos < 0) or (pos > size-1) then | ||
− | raise new Exception('Попытка удаления за границей массива из позиции ' + IntToStr(pos) + ' !' | + | raise new Exception( |
− | + | 'Попытка удаления за границей массива из позиции ' + IntToStr(pos) + '!'); | |
− | |||
− | + | for var i := pos to size - 2 do // сдвиг элементов влево на 1, начиная с позиции pos | |
− | + | data[i] := data[i+1]; | |
− | + | Resize(size - 1); | |
− | for var i := pos to size- | ||
− | data[i] := data[i + | ||
− | Resize(size - | ||
end; | end; | ||
Строка 1400: | Строка 614: | ||
end; | end; | ||
end; | end; | ||
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// ---------------------------- Доступ к элементам --------------------------- | // ---------------------------- Доступ к элементам --------------------------- | ||
{Устанавливает элемент с индексом ind равным x} | {Устанавливает элемент с индексом ind равным x} | ||
Строка 1422: | Строка 620: | ||
begin | begin | ||
if (ind < 0) or (ind > size-1) then | if (ind < 0) or (ind > size-1) then | ||
− | raise new Exception('Попытка | + | raise new Exception( |
+ | 'Попытка присвоить значение элементу за границей массива с индексом ' + IntToStr(ind) + '!'); | ||
+ | |||
data[ind] := x; | data[ind] := x; | ||
end; | end; | ||
Строка 1430: | Строка 630: | ||
begin | begin | ||
if (ind < 0) or (ind > size-1) then | if (ind < 0) or (ind > size-1) then | ||
− | raise new Exception('Попытка | + | raise new Exception( |
+ | 'Попытка получить значение элемента за границей массива с индексом ' + IntToStr(ind) + '!'); | ||
+ | |||
result := data[ind]; | result := data[ind]; | ||
end; | end; | ||
− | // ----------------------------- Вывод | + | // ---------------------------------- Вывод ---------------------------------- |
− | {Выводит содержимое массива | + | {Выводит содержимое массива на консоль} |
− | + | procedure DynArray<DataType>.Println(); | |
− | + | begin | |
− | procedure DynArray<DataType>. | + | for var i := 0 to size - 1 do |
+ | write(data[i-1], ' '); | ||
+ | end; | ||
+ | |||
+ | {Выводит содержимое массива в обратном порядке на консоль} | ||
+ | procedure DynArray<DataType>.PrintlnReverse(); | ||
begin | begin | ||
− | for var i := 1 | + | for var i := size - 1 downto 0 do |
− | + | write(data[i-1], ' '); | |
− | write(data[i-1] | ||
− | |||
− | |||
end; | end; | ||
− | + | ||
− | + | // ------------------------------------------- SIMPLE_SET ----------------------------------------- | |
− | + | {Добавляет элемент x во множество} | |
− | procedure | + | procedure SimpleSet<DataType>.Add(x: DataType); |
begin | begin | ||
− | + | if data.Find(x) = -1 then | |
− | + | data.Add(x); | |
− | |||
− | |||
− | |||
end; | end; | ||
− | + | ||
− | { | + | {Удаляет элемент x из множества} |
− | procedure | + | procedure SimpleSet<DataType>.Remove(x: DataType); |
begin | begin | ||
− | + | var xPos := data.Find(x); | |
− | + | if xPos <> -1 then | |
+ | data.Delete(xPos); | ||
end; | end; | ||
− | { | + | {Возвращает истину, если множество содержит элемент x} |
− | + | function SimpleSet<DataType>.Contains(x: DataType): boolean; | |
begin | begin | ||
− | + | result := (data.Find(x) <> -1); | |
− | |||
end; | end; | ||
− | + | // ---------------------------------- Вывод ---------------------------------- | |
− | + | {Выводит содержимое множества на консоль} | |
− | // ---------------------------------- | + | procedure SimpleSet<DataType>.Println(); |
− | { | ||
− | procedure SimpleSet<DataType>. | ||
begin | begin | ||
− | + | data.Println; | |
− | |||
end; | end; | ||
− | { | + | |
− | procedure | + | // ------------------------------------------- ASSOC_ARRAY ---------------------------------------- |
+ | {Устанавливает значение элемента с ключом key равным value} | ||
+ | procedure AssocArray<KeyType, ValueType>.SetElem(key: KeyType; value: ValueType); | ||
begin | begin | ||
− | + | var ind := Keys.Find(key); | |
− | + | if ind <> -1 then | |
+ | Values[ind] := value | ||
+ | else | ||
+ | begin | ||
+ | Keys.Add(key); | ||
+ | Values.Add(value); | ||
+ | end; | ||
end; | end; | ||
− | { | + | {Возвращает значение элемента с ключом key} |
− | function | + | function AssocArray<KeyType, ValueType>.GetElem(key: KeyType): ValueType; |
begin | begin | ||
− | + | var ind := Keys.Find(key); | |
− | + | if ind <> -1 then | |
− | + | result := Values[ind] | |
− | + | else | |
− | + | begin | |
− | + | Keys.Add(key); | |
− | + | Values.Add(default(ValueType)); | |
+ | result := default(ValueType); | ||
+ | end; | ||
end; | end; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end. | end. | ||
</source> | </source> |
Версия 15:52, 23 апреля 2009
Содержание
Вспомогательные модули
Nodes
/// Модуль содержит шаблоны классов
/// SingleNode — узла с одним полем связи
/// DoubleNode — узла с двумя полями связи
unit Nodes;
interface
type
//-------------------------------------------SINGLE_NODE-------------------------------------------
/// Узел с одним полем связи
SingleNode<DataType> = class
/// Значение узла
data: DataType;
/// Ссылка на следующий элемент
next: SingleNode<DataType>;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="pData">Значение узла</param>
/// <param name="pNext">Ссылка на следующий элемент</param>
constructor Create(pData: DataType; pNext: SingleNode<DataType>);
end;
// -------------------------------------------DOUBLE_NODE------------------------------------------
/// Узел с двумя полями связи
DoubleNode<DataType> = class
/// Значение узла
data: DataType;
/// Ссылка на следующий элемент
next: DoubleNode<DataType>;
/// Ссылка на предыдущий элемент
prev: DoubleNode<DataType>;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="pData">Значение узла</param>
/// <param name="pNext">Ссылка на следующий элемент</param>
/// <param name="pPrev">Ссылка на предыдущий элемент</param>
constructor Create(pData: DataType; pPrev, pNext: DoubleNode<DataType>);
end;
implementation
//-------------------------------------------SINGLE_NODE-------------------------------------------
{Конструктор
pData — значение узла
pNext — cсылка на следующий элемент}
constructor SingleNode<DataType>.Create(pData: DataType; pNext: SingleNode<DataType>);
begin
data := pData;
next := pNext;
end;
// -------------------------------------------DOUBLE_NODE------------------------------------------
{Конструктор
pData — значение узла
pNext — cсылка на следующий элемент
pPrev — ссылка на предыдущий элемент}
constructor DoubleNode<DataType>.Create(pData: DataType; pPrev, pNext: DoubleNode<DataType>);
begin
data := pData;
next := pNext;
prev := pPrev;
end;
end.
Collections
<xh4> Реализация </xh4>
/// Модуль содержит шаблоны классов
/// Stack — стек
/// Queue — очередь
/// DynArray — динамический массив с автоконтролем памяти
/// SimpleSet — простое множество (с минимальным набором операций)
/// AssocArray — ассоциативный массив
unit Collections;
interface
uses Nodes; // для использования типа SingleNode<DataType> —
// узла с одним полем связи
// --------------------------------------------- STACK --------------------------------------------
type
/// Шаблон класса Stack [Стек]
Stack<DataType> = class
private
/// Вершина стека
fTop: SingleNode<DataType> := nil;
public
// ---------------------------- Стандартные методы ---------------------------
/// Создает пустой стек
constructor Create;
/// <summary>
/// Кладет элемент на вершину стека
/// </summary>
/// <param name="x">Новый элемент</param>
procedure Push(x: DataType);
/// Возвращает значение элемента на вершине, снимая его с вершины стека
function Pop: DataType;
/// Возвращает значение элемента на вершине стека, не снимая его
function Top: DataType;
/// Возвращает истину, если стек пуст
function IsEmpty: boolean;
// ---------------------------------- Вывод ----------------------------------
/// Выводит содержимое стека на консоль
procedure Println();
end;
// --------------------------------------------- QUEUE --------------------------------------------
type
/// Шаблон класса Queue [Очередь]
Queue<DataType> = class
private
/// Голова очереди
head: SingleNode<DataType>;
/// Хвост очереди
tail: SingleNode<DataType>;
public
// ---------------------------- Стандартные методы ---------------------------
/// Создает пустую очередь
constructor Create;
/// <summary>
/// Добавляет элемент в хвост очереди
/// </summary>
/// <param name="x">Добавляемый элемент</param>
procedure Enqueue(x: DataType);
/// Возвращает значение элемента в голове, убирая его из головы очереди
function Dequeue: DataType;
/// Возвращает значение элемента в голове очереди, не убирая его
function Top: DataType;
/// Возвращает истину, если очередь пуста
function IsEmpty: boolean;
// ---------------------------------- Вывод ----------------------------------
/// Выводит содержимое очереди на консоль
procedure Println();
end;
// ------------------------------------------- DYN_ARRAY ------------------------------------------
const
/// Минимальная емкость, устанавливаемая при создании массива
MIN_CAP = 4;
/// Коэффициент увеличения емкости массива при её нехватке
INC_CAP_FACTOR = 2;
type
/// Шаблон класса DynArray [Динамический массив с автоконтролем памяти]
DynArray<DataType> = class
private
/// Встроенный динамический массив, содержащий данные
data: array of DataType;
/// Размер массива
size: integer;
/// Емкость массива
cap: integer;
/// Устанавливает элемент с индексом ind равным x
procedure SetElem(ind: integer; x: DataType);
/// Возвращает элемент массива с индексом ind
function GetElem(ind: integer): DataType;
public
// ---------------------------- Стандартные методы ---------------------------
/// Создает массив размера pSize
constructor Create(pSize: integer := 0);
/// <summary>
/// Выделяет новую память. Емкость увеличивается.
/// (Если newCap меньше текущей емкости, ничего не происходит)
/// </summary>
/// <param name="newCap">Новая емкость массива</param>
procedure Reserve(newCap: integer);
/// <summary>
/// Устанавливает новый размер массива
/// </summary>
/// <param name="newSize">Новый размер массива</param>
procedure Resize(newSize: integer);
/// <summary>
/// Добавляет элемент в конец массива
/// </summary>
/// <param name="x">Добавляемый элемент</param>
procedure Add(x: DataType);
/// <summary>
/// Вставляет элемент в указанную позицию
/// </summary>
/// <param name="pos">Позиция, в которую вставляется элемент</param>
/// <param name="x">Вставляемый элемент</param>
procedure Insert(pos: integer; x: DataType);
/// <summary>
/// Удаляет элемент массива из указанной позиции
/// </summary>
/// <param name="pos">Позиция, из которой удаляется элемент</param>
procedure Delete(pos: integer);
/// <summary>
/// Возвращает индекс первого элемента массива равного искомому
/// или -1, если такого элемента нет
/// </summary>
/// <param name="x">Искомый элемент</param>
function Find(x: DataType): integer;
// --------------------------------- Свойства --------------------------------
/// Количество элементов (размер) массива
property Count: integer read size write Resize;
/// Емкость массива (отведенная память)
property Capacity: integer read cap write Reserve;
/// Позволяет обращаться к элементам массива по индексу
/// (например, apples[5])
property Elem[index: integer]: DataType read GetElem write SetElem; default;
// ---------------------------------- Вывод ----------------------------------
/// Выводит содержимое массива на консоль
procedure Println();
/// Выводит содержимое массива в обратном порядке на консоль
procedure PrintlnReverse();
end;
// ------------------------------------------- SIMPLE_SET -----------------------------------------
type
/// Шаблон класса SimpleSet [Простое множество]
SimpleSet<DataType> = class
private
/// Элементы множества
data := new DynArray<DataType>;
public
/// <summary>
/// Добавляет элемент в множество
/// </summary>
/// <param name="x">Добавляемый элемент</param>
procedure Add(x: DataType);
/// <summary>
/// Удаляет элемент из множества
/// </summary>
/// <param name="x">Удаляемый элемент</param>
procedure Remove(x: DataType);
/// <summary>
/// Возвращает истину, если множество содержит элемент
/// </summary>
/// <param name="x">Искомый элемент</param>
function Contains(x: DataType): boolean;
// ---------------------------------- Вывод ----------------------------------
///Выводит содержимое множества на консоль
procedure Println();
end;
// ------------------------------------------- ASSOC_ARRAY ----------------------------------------
type
/// Шаблон класса AssocArray [Ассоциативный массив]
AssocArray<KeyType, ValueType> = class
private
/// Ключи
keys: DynArray<KeyType> := new DynArray<KeyType>;
/// Значения соответствующих ключей
values: DynArray<ValueType> := new DynArray<ValueType>;
/// Устанавливает значение элемента с ключом key равным value
procedure SetElem(key: KeyType; value: ValueType);
/// Возвращает значение элемента с ключом key
function GetElem(key: KeyType): ValueType;
public
// --------------------------------- Свойства --------------------------------
/// Позволяет обращаться к элементам массива по ключу
/// (Например, zoo['крокодил'])
property Elem[key: KeyType]: ValueType read GetElem write SetElem; default;
end;
// ================================================================= IMPLEMENTATION ===================================================================
implementation
// --------------------------------------------- STACK --------------------------------------------
// ---------------------------- Стандартные методы ---------------------------
{Создает пустой стек}
constructor Stack<DataType>.Create;
begin
fTop := nil;
end;
{Кладет x элемент на вершину стека}
procedure Stack<DataType>.Push(x: DataType);
begin
fTop := new SingleNode<DataType>(x, fTop);
end;
{Возвращает значение элемента на вершине, снимая его с вершины стека}
function Stack<DataType>.Pop: DataType;
begin
if IsEmpty then
raise new Exception('Попытка снятия элемента с пустого стека!');
result := fTop.data;
fTop := fTop.next; // элемент снимается с вершины стека
// (т.е. вершиной становится следующий элемент)
end;
{Возвращает значение элемента на вершине стека, не снимая его}
function Stack<DataType>.Top: DataType;
begin
if IsEmpty then
raise new Exception('Попытка получения элемента с пустого стека!');
result := fTop.data;
end;
{Возвращает истину, если стек пуст}
function Stack<DataType>.IsEmpty: boolean;
begin
result := (fTop = nil);
end;
// ---------------------------------- Вывод ----------------------------------
{Выводит содержимое стека на консоль}
procedure Stack<DataType>.Println();
begin
if not IsEmpty then
begin
var curElem := fTop;
while curElem <> nil do
begin
write(curElem.data, ' ');
curElem := curElem.next;
end;
end;
writeln();
end;
// --------------------------------------------- QUEUE --------------------------------------------
// ---------------------------- Стандартные методы ---------------------------
{Создает пустую очередь}
constructor Queue<DataType>.Create;
begin
head := nil;
tail := nil;
end;
{Добавляет элемент ч в хвост очереди}
procedure Queue<DataType>.Enqueue(x: DataType);
begin
if IsEmpty then
begin
head := new SingleNode<DataType>(x, nil);
tail := head;
end
else
begin
tail.next := new SingleNode<DataType>(x, nil);
tail := tail.next; // элемент убирается из хвоста очереди
// (т.е. хвостом становится следующий элемент)
end;
end;
{Возвращает значение элемента в голове, убирая его из головы очереди}
function Queue<DataType>.Dequeue: DataType;
begin
if IsEmpty then
raise new Exception('Попытка удаления элемента из пустой очереди!');
result := head.data;
head := head.next; // элемент убирается из головы очереди
// (т.е. головой становится следующий элемент)
if head = nil then
tail := nil;
end;
{Возвращает значение элемента в голове очереди, не убирая его}
function Queue<DataType>.Top: DataType;
begin
if IsEmpty then
raise new Exception('Попытка получения элемента из пустой очереди!');
result := head.data;
end;
{Возвращает истину, если очередь пуста}
function Queue<DataType>.IsEmpty: boolean;
begin
result := (head = nil);
if result then
Assert(tail = nil);
end;
// ---------------------------------- Вывод ----------------------------------
{Выводит содержимое очереди на консоль}
procedure Queue<DataType>.Println();
begin
if not IsEmpty then
begin
var curElem := head;
while curElem <> nil do
begin
write(curElem.data, ' ');
curElem := curElem.next;
end;
end;
writeln();
end;
// -------------------------------------------DYN_ARRAY ------------------------------------------
// ---------------------------- Стандартные методы ---------------------------
{Создает массив размера pSize}
constructor DynArray<DataType>.Create(pSize: integer);
begin
size := pSize;
cap := INC_CAP_FACTOR*pSize + MIN_CAP; // Устанавливаем емкость "с запасом"
SetLength(data, cap);
end;
{Выделяет новую память. Емкость увеличивается до newCap.
(Если newCap меньше текущей емкости, ничего не происходит) }
procedure DynArray<DataType>.Reserve(newCap: integer);
begin
if newCap > cap then
begin
SetLength(data, newCap);
cap := newCap;
end;
end;
{Устанавливает новый размер массива равным newSize}
procedure DynArray<DataType>.Resize(newSize: integer);
begin
if newSize > cap then
begin
Reserve(INC_CAP_FACTOR * newSize);
for var i := size to newSize - 1 do // явным образом заполняем новые элементы
data[i] := default(DataType);
end;
size := newSize;
end;
{Добавляет элемент x в конец массива }
procedure DynArray<DataType>.Add(x: DataType);
begin
Resize(size + 1);
data[size-1] := x;
end;
{Вставляет x элемент в позицию pos}
procedure DynArray<DataType>.Insert(pos: integer; x: DataType);
begin
if (pos < 0) or (pos > size-1) then
raise new Exception(
'Попытка вставки за границей массива в позицию ' + IntToStr(pos) + '!');
Resize(size + 1);
for var i := size - 2 downto pos do
data[i+1] := data[i];
data[pos] := x;
end;
{Удаляет элемент массива из позиции pos}
procedure DynArray<DataType>.Delete(pos: integer);
begin
if (pos < 0) or (pos > size-1) then
raise new Exception(
'Попытка удаления за границей массива из позиции ' + IntToStr(pos) + '!');
for var i := pos to size - 2 do // сдвиг элементов влево на 1, начиная с позиции pos
data[i] := data[i+1];
Resize(size - 1);
end;
{Возвращает индекс первого элемента массива равного x
или -1, если такого элемента нет}
function DynArray<DataType>.Find(x: DataType): integer;
begin
result := -1;
for var i := 0 to size - 1 do
if data[i] = x then
begin
result := i;
exit;
end;
end;
// ---------------------------- Доступ к элементам ---------------------------
{Устанавливает элемент с индексом ind равным x}
procedure DynArray<DataType>.SetElem(ind: integer; x: DataType);
begin
if (ind < 0) or (ind > size-1) then
raise new Exception(
'Попытка присвоить значение элементу за границей массива с индексом ' + IntToStr(ind) + '!');
data[ind] := x;
end;
{Возвращает элемент массива с индексом ind}
function DynArray<DataType>.GetElem(ind: integer): DataType;
begin
if (ind < 0) or (ind > size-1) then
raise new Exception(
'Попытка получить значение элемента за границей массива с индексом ' + IntToStr(ind) + '!');
result := data[ind];
end;
// ---------------------------------- Вывод ----------------------------------
{Выводит содержимое массива на консоль}
procedure DynArray<DataType>.Println();
begin
for var i := 0 to size - 1 do
write(data[i-1], ' ');
end;
{Выводит содержимое массива в обратном порядке на консоль}
procedure DynArray<DataType>.PrintlnReverse();
begin
for var i := size - 1 downto 0 do
write(data[i-1], ' ');
end;
// ------------------------------------------- SIMPLE_SET -----------------------------------------
{Добавляет элемент x во множество}
procedure SimpleSet<DataType>.Add(x: DataType);
begin
if data.Find(x) = -1 then
data.Add(x);
end;
{Удаляет элемент x из множества}
procedure SimpleSet<DataType>.Remove(x: DataType);
begin
var xPos := data.Find(x);
if xPos <> -1 then
data.Delete(xPos);
end;
{Возвращает истину, если множество содержит элемент x}
function SimpleSet<DataType>.Contains(x: DataType): boolean;
begin
result := (data.Find(x) <> -1);
end;
// ---------------------------------- Вывод ----------------------------------
{Выводит содержимое множества на консоль}
procedure SimpleSet<DataType>.Println();
begin
data.Println;
end;
// ------------------------------------------- ASSOC_ARRAY ----------------------------------------
{Устанавливает значение элемента с ключом key равным value}
procedure AssocArray<KeyType, ValueType>.SetElem(key: KeyType; value: ValueType);
begin
var ind := Keys.Find(key);
if ind <> -1 then
Values[ind] := value
else
begin
Keys.Add(key);
Values.Add(value);
end;
end;
{Возвращает значение элемента с ключом key}
function AssocArray<KeyType, ValueType>.GetElem(key: KeyType): ValueType;
begin
var ind := Keys.Find(key);
if ind <> -1 then
result := Values[ind]
else
begin
Keys.Add(key);
Values.Add(default(ValueType));
result := default(ValueType);
end;
end;
end.