Очередь строковых значений (через односвязные списки) - PascalABC.NET
Формулировка задачи:
Создать очередь строковых значений, для реализации используя одно-
связные списки. Реализовать операции добавления (enqueue) и удаления
(dequeue) элемента из очереди. Добавьте в очередь строки «one», «two»,
«three», «four», «five», «six», «seven» и распечатайте содержимое очере-
ди. Удалите 4 элемента из очереди, затем добавьте в очередь строки
«eight», «nine» и распечатайте очередь еще раз.
* Найдите количество строк, состоящих из 4 символов
Решение задачи: «Очередь строковых значений (через односвязные списки)»
textual
Листинг программы
const st: array [1..7] of string = ('one', 'two', 'three', 'four', 'five', 'six', 'seven'); type //Указатель на элемент очереди. TPElem = ^TElem; //Элемент очереди. TElem = record Data: string; //Основные данные. PNext: TPElem; //Указатель на следующий элемент в очереди. end; //Очередь. TQueue = record PFirst, PLast: TPElem; //Указатель на первый и последний элементы очереди. Cnt: Integer; //Количество элементов в очереди. end; //Инициализация очереди. Внимание! Нельзя выполнять эту процедуру в отношении //непустой очереди! Иначе, произойдёт утечка памяти. //Эту процедуру следует выполнять в самом начале программы. procedure Init(var aQueue: TQueue); begin aQueue.PFirst := nil; aQueue.PLast := nil; aQueue.Cnt := 0; end; //Добавление элемента в конец очереди. procedure QueuePush(var aQueue: TQueue; var aPElem: TPElem); begin if aPElem = nil then Exit; aPElem^.PNext := nil; if aQueue.PFirst = nil then aQueue.PFirst := aPElem else aQueue.PLast^.PNext := aPElem ; aQueue.PLast := aPElem; Inc(aQueue.Cnt); end; //Изъятие элемента из начала очереди. function QueuePop(var aQueue: TQueue; var aPElem: TPElem): Boolean; begin QueuePop := False; if aQueue.PFirst = nil then Exit; aPElem := aQueue.PFirst; aQueue.PFirst := aPElem^.PNext; if aQueue.PFirst = nil then aQueue.PLast := nil; Dec(aQueue.Cnt); QueuePop := True; end; //Удаление очереди из памяти (очистка очереди). procedure QueueFree(var aQueue: TQueue); var PDel: TPElem; begin while QueuePop(aQueue, PDel) do Dispose(PDel); end; //Распечатка очереди. procedure QueuePrint(var aQueue: TQueue); var QTmp: TQueue; PElem: TPElem; i: Integer; begin if aQueue.PFirst = nil then begin Writeln('Очередь пуста.'); Exit; end; //Начальная инициализация вспомогательной очереди. Init(QTmp); //Переливаем элементы из исходной очереди во вспомогательную и при этом //выполняем распечатку. i := 0; while QueuePop(aQueue, PElem) do begin //Добавление элемента во вспомогательную очередь. QueuePush(QTmp, PElem); //Распечатка. Inc(i); if i > 1 then Write(', '); Write(PElem^.Data); end; Writeln; aQueue := QTmp; end; const //Основа для выбора длины очереди. M = 10; var Q1, Q2: TQueue; PElem: TPElem; k, i, j: Integer; S: String; begin //Инициализация очередей. Init(Q1); for i := 1 to 7 do begin New(PElem); PElem^.Data := st[i]; // Добавьте в очередь строки QueuePush(Q1, PElem); end; Writeln('Составлены очереди:'); Writeln('Первая очередь. Количество элементов: ', Q1.Cnt, '. Элементы:'); QueuePrint(Q1); for i := 1 to 4 do QueuePop(Q1, PElem); Writeln('Новая очередь. Количество элементов: ', Q1.Cnt, '. Элементы:'); QueuePrint(Q1); New(PElem); PElem^.Data := 'eight'; QueuePush(Q1, PElem); New(PElem); PElem^.Data := 'nine'; QueuePush(Q1, PElem); Writeln('Еще одна новая очередь. Количество элементов: ', Q1.Cnt, '. Элементы:'); j := Q1.Cnt; writeln(j); QueuePrint(Q1); k := 0; for i := 1 to j do begin if length(PElem^.Data) = 4 then inc(k); QueuePop(Q1, PElem); end; writeln('количество строк, состоящих из 4 символов: ', k); QueueFree(Q1); end.
Объяснение кода листинга программы
- Объявление и инициализация односвязного списка (связного списка) для хранения элементов очереди.
- Объявление и инициализация типа указателя на элемент связного списка.
- Объявление и инициализация типа элемента связного списка.
- Объявление и инициализация типа связного списка.
- Объявление и инициализация двух связных списков (Q1 и Q2).
- Инициализация первого связного списка (Q1).
- Добавление элементов в первый связный список (Q1).
- Печать первого связного списка (Q1).
- Извлечение первых четырех элементов из первого связного списка (Q1).
- Печать первого связного списка (Q1) после извлечения элементов.
- Добавление двух новых элементов в первый связный список (Q1).
- Печать первого связного списка (Q1) после добавления элементов.
- Объявление и инициализация трех переменных (k, i, j) для использования в циклах.
- Объявление и инициализация строки S.
- Объявление и инициализация нового связного списка (Q2).
- Добавление элементов в новый связный список (Q2).
- Печать нового связного списка (Q2).
- Извлечение элементов из нового связного списка (Q2).
- Печать нового связного списка (Q2) после извлечения элементов.
- Добавление элемента 'eight' в новый связный список (Q2).
- Добавление элемента 'nine' в новый связный список (Q2).
- Печать нового связного списка (Q2) после добавления элементов.
- Объявление и инициализация переменной j для использования в циклах.
- Проверка длины каждого элемента в новом связном списке (Q2).
- Извлечение элементов из нового связного списка (Q2).
- Печать нового связного списка (Q2) после извлечения элементов.
- Объявление и инициализация переменной k для использования в циклах.
- Проверка количества строк, состоящих из четырех символов, в новом связном списке (Q2).
- Освобождение памяти, выделенной для элементов нового связного списка (Q2).