Динамічні структури даних: стеки 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>
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 p>
# include p>
void main (void) p>
( p>
char S [255]; p>
FILE * T; p>
int I; BT X, Y; p>
Zveno * NS; p>
clrscr (); p>
cout> S; p>
T = fopen (S, "r"); p>
NS = NULL; p>
while (! feof (T)) p>
( p>
fgets (S, 255, T); p>
I = 0; p>
while (I = '0 '& & S [I] = '0' & & S [I]