program StackDemo;
{$mode objfpc}{$H+}
{$codepage UTF-8}
uses
heaptrc, // Хорошая привычка для отслеживания утечек объектов
{$ifdef unix}cwstring,{$endif}
SysUtils,
ConsoleUtils,
FixedStack; // Наш модуль со стеком
var
Stack: TFixedStack;
begin
{ --- Сценарий 1. Нормальная работа --- }
WriteLn('=== Нормальная работа (ёмкость: 3) ===');
Stack := TFixedStack.Create(3);
try
WriteLn('Push(10), Push(20), Push(30)');
Stack.Push(10);
Stack.Push(20);
Stack.Push(30);
WriteLn('Вершина (Peek): ', Stack.Peek);
WriteLn('Pop → ', Stack.Pop);
WriteLn('Pop → ', Stack.Pop);
WriteLn('Pop → ', Stack.Pop);
Write('Стек пуст: ');
if Stack.IsEmpty then WriteLn('да') else WriteLn('нет');
finally
Stack.Free; // Гарантированно удаляем стек
end;
WriteLn;
{ --- Сценарий 2. Переполнение --- }
WriteLn('=== Переполнение ===');
Stack := TFixedStack.Create(3);
try
WriteLn('Push(1), Push(2), Push(3) — ОК');
Stack.Push(1);
Stack.Push(2);
Stack.Push(3);
WriteLn('Push(4)...');
Stack.Push(4); // Тут произойдет взрыв (исключение)!
except
on E: EStackOverflowError do
begin
// Ловим специфичное исключение и вытягиваем из него поле Capacity
WriteLn('Переполнение: ', E.Message);
end;
end;
// Стек упал на ошибке, но мы обязаны его очистить
Stack.Free;
WriteLn;
{ --- Сценарий 3. Обращение к пустому стеку --- }
WriteLn('=== Обращение к пустому стеку ===');
Stack := TFixedStack.Create(3);
try
WriteLn('Pop()...');
Stack.Pop; // Попытка снять элемент из пустого стека
except
on E: EStackUnderflowError do
begin
WriteLn('Нельзя снять элемент: ', E.Message);
end;
end;
Stack.Free;
WriteLn;
WriteLn('Нажмите Enter для выхода...');
ReadLn;
end.