program StackMinRemoval;
const
MAX_SIZE = 100;
type
Stack = record
data: array [1..MAX_SIZE] of integer;
top: integer;
end;
procedure InitializeStack(var s: Stack);
begin
s.top := 0;
end;
procedure Push(var s: Stack; value: integer);
begin
if s.top < MAX_SIZE then
begin
s.top := s.top + 1;
s.data[s.top] := value;
end;
end;
function Pop(var s: Stack): integer;
begin
if s.top > 0 then
begin
Pop := s.data[s.top];
s.top := s.top - 1;
end;
end;
function IsEmpty(s: Stack): boolean;
begin
IsEmpty := s.top = 0;
end;
procedure RemoveMinValues(var s: Stack);
var
min, i: integer;
begin
min := s.data[1];
for i := 2 to s.top do
begin
if s.data[i] < min then
min := s.data[i];
end;
i := 1;
while i <= s.top do
begin
if s.data[i] = min then
begin
for i := i to s.top - 1 do
s.data[i] := s.data[i + 1];
s.top := s.top - 1;
end
else
i := i + 1;
end;
end;
procedure PrintStack(s: Stack);
var
i: integer;
begin
for i := 1 to s.top do
Write(s.data[i], ' ');
end;
var
s: Stack;
value: integer;
begin
InitializeStack(s);
// Заполнение стека
Push(s, 5);
Push(s, 2);
Push(s, 3);
Push(s, 2);
Push(s, 1);
Write('Исходный стек: ');
PrintStack(s);
Writeln;
RemoveMinValues(s);
Write('Стек после удаления минимальных значений: ');
PrintStack(s);
end.