Динамічні структури даних: стеки 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 <= Length (S) Do p>
Begin p>
If S [I] In ['0 '.. '9'] p>
Then p>
Begin p>
N: = I; p>
While S [I] In ['0 '.. '9'] Do p>
I: = I + 1; p>
Val (Copy (S, N, I - N), X, Code); p>
V_Stack (NS, X); p>
End p>
Else p>
If S [I] In Znak p>
Then p>
Begin p>
Iz_Stack (NS, X); p>
Iz_Stack (NS, Y); p>
Case S [I] Of p>
'+': X: = X + Y; p>
'-': X: = Y - X; p>
'*': X: = X * Y; p>
'/': X: = Y Div X p>
End; p>
V_Stack (NS, X) p>
End; p>
I: = I + 1 p>
End; p>
Iz_Stack (NS, X); p>
WriteLn (S, '=', X); p>
End p>
End. p>
p>
/* C + +, файл ST2.CPP */ p>
# include
"STACK.CPP" p>
# include <
string.h> 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 << "Введіть ім'я файлу:
"; Cin>> 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 <= strlen (S) -1) p>
( p>
if (S [I]> = '0 '& & S [I] <= '9') p>
( p>
X = 0; p>
while (S [I]> = '0 '& & S [I] <= '9')
(X = X * 10 + (S [I] - '0 '); I + +;) p>
NS = V_Stack (NS, X); p>
) p>
else p>
if
(S [I ]=='+'|| S [I ]=='-'|| S [I ]=='/'|| S [I ]=='*') p>
( p>
X = V_Vershine (NS); p>
NS = Iz_Stack (NS); p>
Y = V_Vershine (NS); p>
NS = Iz_Stack (NS); p>
switch (S [I]) ( p>
case '+': X + = Y; break; p>
case '-': X = Y - X; break; p>
case '*': X *= Y; break; p>
case '/': X = Y/X; break;) p>
NS = V_Stack (NS, X); p>
) p>
I + +; p>
) p>
X = V_Vershine (NS); p>
NS = Iz_Stack (NS); p>
cout <"
<
) p>
Список літератури h2>
Для
підготовки даної роботи були використані матеріали з сайту http://comp-science.narod.ru
p>