Стек Задача «Скобки» Динамические структуры данных (язык Паскаль)
Стек Задача «Скобки» Динамические структуры данных (язык Паскаль)
2 Стек Стек – это линейная структура данных, в которой добавление и удаление элементов возможно только с одного конца (вершины стека). Stack = кипа, куча, стопка (англ.) LIFO = Last In – First Out «Кто последним вошел, тот первым вышел». Операции со стеком: Add добавить элемент на вершину (Push = втолкнуть); Get Взять элемент с вершины (Pop = вылететь со звуком).
3 Системный стек (Windows – 1 Мб) Используется для размещения локальных переменных; хранения адресов возврата (по которым переходит программа после выполнения функции или процедуры); передачи параметров в функции и процедуры; временного хранения данных (в программах на языке Ассмеблер). Переполнение стека (stack overflow): слишком много локальных переменных (выход – использовать динамические массивы); очень много рекурсивных вызовов функций и процедур (выход – переделать алгоритм так, чтобы уменьшить глубину рекурсии или отказаться от нее вообще).
3 Операции со стеком 1 1 2 1 2 3 1 2 Добавление Извлечение
3 1 1 2 1 2 3 1 2 Добавление Извлечение Должен быть «Механизм выталкивания»
Операции со стеком
Операции со стеком
Операции со стеком 1 1 2 1 2 3 1 2 3 Добавление Извлечение
Операции со стеком 1 1 2 1 2 3 1 2 3 Добавление Извлечение Можно обойтись одним указателем!
Операции со стеком 1 1 2 1 2 3 1 2 3 Добавление Извлечение
Операции со стеком 1 2 3 2 3 Инициализация S[i]=0 Init Head=1 Пустота Empty Head=1 Добавление Add S[Head]=x Head =Head+1 3 Извлечение Get Head=Head-1 x=S[Head] 1 11 4 6 7 5 Полнота Full (переполнение) Head=Max+1 3 2 1 3
12 Пример задачи Задача: вводится символьная строка, в которой записано выражение со скобками трех типов: [], {} и (). Определить, верно ли расставлены скобки (не обращая внимания на остальные символы). Примеры: [()]{} ][ [({)]} Упрощенная задача: то же самое, но с одним видом скобок. Решение: счетчик вложенности скобок. Последовательность правильная, если в конце счетчик равен нулю и при проходе не разу не становился отрицательным.
13 Решение задачи со скобками Алгоритм: в начале стек пуст; в цикле просматриваем все символы строки по порядку; если очередной символ – открывающая скобка, заносим ее на вершину стека; если символ – закрывающая скобка, проверяем вершину стека: там должна быть соответствующая открывающая скобка (если это не так, то ошибка); если в конце стек не пуст, выражение неправильное. [ ( ( ) ) ] { }
14 Реализация стека (массив) Структура-стек: const MAX = 100; ;{ стек на 100 символов } type Stack = array[1..MAX] of char Var x:char; Head,i: integer; { число элементов } ... Добавление элемента: procedure Add( var x: char); begin if not IsFull then Exit; S[Head]:=x; Head:=Head +1 end; ошибка: переполнение стека добавить элемент
15 Реализация стека (массив) Function Get : char; begin if IsEmpty then begin Get := char(255); Exit; end; Head:=Head -1; Get := S[Head]; end; Снятие элемента с вершины: Пустой или нет? function IsEmpty : Boolean; begin If Head=1 then IsEmpty:= true else IsEmpty:= false; end; ошибка: стек пуст
16 Программа var br1, br2, expr: string; i, k: integer; upper: char; { то, что сняли со стека } error: Boolean; { признак ошибки } S: Stack; begin br1 := '([{'; br2 := ')]}'; Head:=1; error := False; writeln('Введите выражение со скобками'); readln(expr); ... { здесь будет основной цикл обработки } if not error and isEmpty(S) then writeln('Выражение правильное.') else writeln('Выражение неправильное.') end. открывающие скобки закрывающие скобки
17 ДЗ Реализовать структуру Стек 2. Реализовать задачу «Скобки» (слайд13) с использованием структуры Стек
18320-val_stekgotdz.ppt
- Количество слайдов: 17

