Загрузка данных


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.