Динамічні
структури даних: стеки h2>
Стек - динамічна структура даних, що представляє із себе
упорядкований набір елементів, в якій додавання нових елементів і видалення
існуючих проводиться з одного кінця, званого вершиною стека. p>
За визначенням,
елементи витягуються з стека в порядку, зворотному їх додавання в цю
структуру, тобто діє принцип "останній прийшов - перший пішов". p>
Найбільш
наочним прикладом організації стека служить дитяча пірамідка, де додавання і
зняття кілець здійснюється саме згідно з визначенням стека. p>
Стек можна
організувати на базі будь-якої структури даних, де можна зберігати декількох
однотипних елементів і де можна реалізувати визначення стека: лінійний
масив, типізований файл, односпрямований або двонаправлений список. У
нашому випадку найбільш відповідним для реалізації стека є односпрямований
список, причому як вершини стека виберемо початок цього списку. p>
Виділимо типові
операції над стеком і його елементами: p>
додавання
елемента в стек; p>
видалення
елемента з стека; p>
перевірка, порожній
Чи стек; p>
перегляд
елемента в вершині стека без видалення; p>
очищення стека. p>
Реализуем ці
операції, використовуючи розроблений раніше модуль для односпрямований списків
(див. матеріал "Динамічні
структури даних: списки
"). p>
(
Turbo Pascal, файл
STACK.PAS) p>
Unit
Stack; p>
Interface p>
Uses Spisok; p>
Procedure V_Stack (Var Versh: U; X: BT); p>
Procedure Iz_Stack (Var Versh: U; Var X:
BT); p>
Function Pust (Versh: U): Boolean; p>
Function V_Vershine (Versh: U): BT; p>
Procedure Ochistka (Var Versh: U); p>
Implementation p>
Procedure V_Stack; p>
Begin p>
V_Nachalo (Versh, X) p>
End; p>
Procedure Iz_Stack; p>
Begin p>
Iz_Nachala (Versh, X) p>
End; p>
Function Pust; p>
Begin p>
Pust: = Versh = Nil p>
End; p>
Function V_Vershine; p>
Begin p>
V_Vershine: = Versh ^. Inf p>
End; p>
Procedure Ochistka; p>
Begin p>
Spisok.Ochistka (Versh) p>
End; p>
Begin p>
End. p>
/*
C + +, файл
STACK.CPP */ p>
# include
"SPIS.CPP" p>
Zveno
* V_Stack (Zveno * Versh, BT X) p>
( p>
return V_Nachalo (Versh, X); p>
) p>
Zveno
* Iz_Stack (Zveno * Versh) p>
( p>
return Iz_Nachala (Versh); p>
) p>
int
SPust (Zveno * Versh) p>
( p>
return! Versh; p>
) p>
BT
V_Vershine (Zveno * Versh) p>
( p>
return Versh-> Inf; p>
) p>
Zveno
* Chistka (Zveno * Versh) p>
( p>
while
(! Pust (Versh)) Versh = Iz_Stack (Versh); p>
return Versh; p>
) p>
Використовуючи
розроблені тут бібліотеки, вирішимо завдання. p>
Приклад.
Написати програму, яка обчислює як ціле число значення виразів (без
змінних), записаних (без помилок) в постфіксной формі в текстовому файлі.
Кожен рядок файлу містить рівно один вислів. P>
Алгоритм
рішення. Вираз проглядається зліва направо. Якщо зустрічається число, то
його значення (як ціле) заноситься в стек, а якщо встечаются знак операції, то
з стека витягуються два останніх елементу (це операнди даної операції), над
ними виконується операція і її результат записується в стек. Наприкінці в стеку
залишається тільки одне число - значення всього виразу. p>
(
Turbo Pascal, файл
ST2.PAS) p>
Program St2; p>
Uses Spisok, Stack; p>
Const Znak = ['+', '-', '*','/']; p>
Var S, S1: String; p>
T: Text; p>
I, N: Byte; p>
X, Y: BT; Code: Integer; p>
NS: U; p>
Begin p>
Write ( 'Введіть ім'я файлу:'); ReadLn (S1); p>
Assign (T, S1); ReSet (T); p>
NS: = Nil; p>
While Not Eof (T) Do p>
Begin p>
ReadLn (T, S); I: = 1; p>
While I