-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStackCommand.pas
More file actions
124 lines (113 loc) · 3.15 KB
/
StackCommand.pas
File metadata and controls
124 lines (113 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
unit StackCommand;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DataTypes;
// процедура инициализации стека
procedure createStack(var Work: TStack);
// функция проверки на пустой стек, возвращает занчение True - если стек пустой
function isEmptyStack(Work: TStack): Boolean;
// процедура создания нового узла стека
procedure makeStack(var Work: TStack; x: TItemS);
// процедура добовления узла в стек
procedure push(var Work: TStack; x: TItemS);
// процедура удаления узла из стека
procedure pop(var Work:TStack; var x: TItemS);
// функция фозвращает значение из вершины стека без изменения стека
function topStack(Work: TStack):TItemS;
// процедура перевертывания стека
procedure InvertStack(StratStek: TStack; var FinalSteck: TStack);
// процедура очистки стека
procedure ClearStack(var Work: TStack);
implementation
// процедура инициализации стека
procedure createStack(var Work: TStack);
begin
Work:=nil;
end;
// процедура создания нового узла стека
procedure makeStack(var Work: TStack; x: TItemS);
begin
// выделяем память под новый узел
New(Work);
// записываем значение в информационное поле
Work^.Data:=x;
// обнуляем ссылку на следующий узел
Work^.Next:=nil;
end;
// функция возвращает ИСТИНУ если стек пустой, и ЛОЖЬ в противном случае
function isEmptyStack(Work: TStack): boolean;
begin
Result:=Work=nil;
end;
// процедура добовления узла в стек
procedure push(var Work: TStack; x: TItemS);
var Work2: TStack;
begin
// если стек пустой, создаем первый элемент
if (isEmptyStack(Work)) then
begin
makeStack(Work,x);
end
else
begin
// создаем новый узел
makeStack(Work2,x);
// к новому узлу подвязываем весь стек
Work2^.Next:=Work;
// возвращаем указатель на новае начало стека
Work:=Work2;
end;
end;
// процедура удаления узла из стека
procedure pop(var Work:TStack; var x: TItemS);
var Work2: TStack;
begin
if not(isEmptyStack(Work)) then
begin
// если стек не пустой
// запоминаем первый узел стека
Work2:=Work;
// втарой узел стека делаем первым
Work:=Work^.Next;
// отвязываем первый узел от стека
Work2^.Next:=nil;
// запоминаем информацию из удоляемого узла
x:=Work2^.Data;
// освобождаем память занимаемую удоляемым узлом
Dispose(Work2);
end
else
begin
// если стек пустой
// очищаем указатели на его
Work:=nil;
end;
end;
// функция фозвращает значение из вершины стека без изменения стека
function topStack(Work: TStack):TItemS;
begin
Result:=Work^.Data;
end;
// процедура перевертывания стека
procedure InvertStack(StratStek: TStack; var FinalSteck: TStack);
var temp: TItemS;
begin
// создаем новый стек
createStack(FinalSteck);
// проходим по всему начальному стеку
while not(isEmptyStack(StratStek)) do
begin
// извлекаем элемент из начального стека
pop(StratStek,temp);
// помещаем извленный элемент в новый стек
push(FinalSteck,temp);
end;
end;
procedure ClearStack(var Work: TStack);
var temp: TItemS;
begin
while Work<>nil do
pop(Work,temp);
end;
end.