Лабораторная работа 4 Линейные связанные структуры
1. Стек
2. Очередь
3. Список
Стек
– это структура данных, организованная по принципу LIFO (Last-In, First-Out): поступивший последним, обслуживается первым. Образно это можно представить, как запаянную с одной стороны трубку, в которую закатываются шарики. Первый шарик всегда будет доставаться из трубки последним. Элементы в стек можно добавлять или извлекать только через его вершину.
Программно стек реализуется в виде однонаправленного списка с одной точкой входа (вершиной стека).
Пример. Используя стек, напечатать содержимое текстового файла в обратном порядке.
Решение:
Program STEK; Type EXST = ^ST; ST = record Data : char; Next : EXST; End; Var Stack : EXST; {Текущая переменная} i : integer; f : text; Stroka : string; c : char; Procedure writeStack(Var u : EXST; Simvol : char); Var x : EXST; Begin new(x); x^.Data := Simvol; x^.Next := u; u := x; End; Procedure Print(Var u : EXST); Begin while u <> Nil do Begin write (u^.Data); u := u^.Next; End; End;
Begin Stack := Nil; Assign(f, 'TEXT.IN'); Reset(f); while Not Eof(f) do Begin readln(f,Stroka); For i := 1 to Length(Stroka) do writeStack(Stack, Stroka[i]); End; close(f); Print(Stack); End.
Контрольные вопросы
-
Дайте определение динамической структуры «стек».
-
Сколько элементов может содержать стек?
-
Можно ли последовательно "связать" два стека разного типа и почему?
-
Можно ли одновременно работать с несколькими стеками?
Упражнения
1. Создать стек со случайными целыми числами в диапазоне –50 до +50 и преобразовать его в два стека. Первый должен содержать только положительные числа, а второй - отрицательные. Порядок чисел должен быть сохранен, как в первом стеке.
2. Создать стек из случайных целых чисел и удалить из него записи с четными числами.
3. Создать стек из случайных целых чисел в диапазоне от –10 до 10 и удалить из него записи с отрицательными числами.
4. Создать стек из случайных целых чисел и поменять местами крайние элементы.
5. Подсчитать, сколько элементов стека, построенного из случайных чисел, превышает среднее значение от всех элементов стека.
6. Создать стек из случайных целых чисел и найти в нем максимальное и минимальное значение.
7. Создать стек из случайных целых чисел и определить, сколько элементов стека, начиная с вершины, находится до элемента с максимальным значением.
8. Создать текстовый файл, содержащий текстовую и числовую информацию. Используя стек, создать другой текстовый файл, в котором числа будут записаны в обратном порядке.
9. Создать текстовый файл, содержащий текстовую информацию. Используя стек, создать другой текстовый файл, в котором слова будут записаны в обратном порядке.
10. Создать текстовый файл, содержащий некоторую информацию. Используя стек, создать другой текстовый файл, в котором строки будут записаны в обратном порядке.
11. Создать текстовые файлы, содержащие один текстовую, а другой числовую информацию (количество слов и чисел должно быть одинаковым). Используя стек, создать другой текстовый файл, в котором числа и слова чередовались:
1) и были бы записаны в обратном порядке;
2) а порядок чисел и слов был бы сохранен.
12. Создать текстовые файлы, содержащие один текстовую, а другой числовую информацию (количество слов и чисел может быть неодинаковым). Используя стек, создать другой текстовый файл, в котором числа и слова чередовались и были бы записаны в обратном порядке ("лишние" числа или слова были бы записаны в конец файла).
13. В файле находится текст программы на Паскале. Используя стек, проверить правильность вложений в этой программе:
1) циклов;
2) операторных скобок (begin - end).
14. В файле записан текст, сбалансированный по круглым скобкам. Требуется для каждой пары соответствующих открывающей и закрывающей скобок напечатать номера их позиций в тексте, упорядочив пары номеров по возрастанию номеров позиций закрывающих скобок. Например, для текста a+(45-f(x)*(b-c)) надо напечатать 8 10, 12 16, 3 17.
15. В текстовом файле без ошибок записано логическое выражение следующего вида: <лог.выр>::=true | false | <лог.выр> and <лог.выр> | <лог.выр> or <лог.выр>. Используя стек, вычислить значение этого выражения с учетом общепринятого приоритета операций.
16. Написать процедуру присоединения стека S2 к стеку S1.
17. Определить симметричность произвольного текста любой длины. Текст должен оканчиваться точкой. Задачу решить с помощью двух стеков.
18. Слить два стека, содержащих возрастающую последовательность целых положительных чисел, в третий стек так, чтобы его элементы располагались также в порядке возрастания.
19. Проверить, является ли строка палиндромом.