program Vyhodnocovani_matematickych_vyrazu;

uses crt;

type spoj = ^element;
     element = record
                 hodnota: char;
                 dalsi: spoj;
               end;
var zasobnik : spoj;
    vyraz : string;
    znak : char;
    i : integer;
    chyba, vklad : boolean;

procedure Vytvor;
begin
  zasobnik := nil;
end;

procedure Vloz(X: char);
var pom: spoj;
begin
  new(pom);
  with pom^ do
  begin
    hodnota := X;
    dalsi := zasobnik;
  end;
  zasobnik := pom;
end;

procedure Odeber(var X: char);
var pom: spoj;
begin
  if zasobnik = nil then
  begin
    write('Pozor - zasobnik je prazdny.');
    chyba := true;
    Exit;
  end
  else begin
    X := zasobnik^.hodnota;
    pom := zasobnik;
    zasobnik := zasobnik^.dalsi;
    dispose(pom);
  end;
end;

function Jeprazdny: boolean;
begin
  if zasobnik = nil then Jeprazdny := true
  else Jeprazdny := false;
end;

BEGIN
  clrscr;
  Vytvor;
  chyba := false;
  vklad := false;
  writeln('Tento program vyhodnocuje mat. vyrazy, zda jsou spravne uzavorkovany.');
  writeln;
  write('Vloz matematicky vyraz : ');
  readln(vyraz);
  writeln;
  for i := 1 to length(vyraz) do
  begin
    if vyraz[i] = '(' then
    begin
      Vloz('(');
      vklad := true;
    end;
    if vyraz[i] = ')' then Odeber(znak);
  end;
  writeln;
  if not(vklad) then writeln('Matematicky vyraz nema zavorky.') 
  else if (Jeprazdny and not(chyba)) then writeln('Matematicky vyraz je spravne uzavorkovan.')
  else writeln('Matematicky vyraz neni spravne uzavorkovan.');
  writeln;
  writeln('Stiskni ENTER ...');
  readln;
END.