Program P127;
 { Crearea şi prelucrarea unei stive }
type AdresaCelula=^Celula;
     Celula=record
                  Info : string;
                  Prec : AdresaCelula;
            end;
var S : AdresaCelula; { adresa vîrfului }
    c : char;

procedure Introduc;
var R : AdresaCelula;
begin
 new(R);
 writeln('Daţi elementul ce urmează să fie introdus:');
 readln(R^.Info);
 R^.Prec:=S;
 S:=R;
end; { Includ }

procedure Extrag;
var R : AdresaCelula;
begin
 if S=nil then writeln('Stiva este vidă')
          else begin
                 R:=S;
                 writeln('Este extras elementul:');
                 writeln(R^.Info);
                 S:=S^.Prec;
                 dispose(R);
               end;
end; { Extrag }

procedure Afis;
var R : AdresaCelula;
begin
 if S=nil then writeln('Stiva este vidă')
   else begin
          writeln('Stiva include elementele:');
          R:=S;
          while R<>nil do begin
                            writeln(R^.Info);
                            R:=R^.Prec;
                          end;
        end;
 readln;
end; { Afis }

begin
 S:=nil;  { iniţial stiva este vidă }
 repeat
   writeln('Meniu:');
   writeln('   I - Introducerea elementului;');
   writeln('   E - Extragerea elementului');
   writeln('   A - Afişarea stivei la ecran');
   writeln('   O - Oprirea programului');
   write('Opţiunea='); readln(c);
   case c of
       'I' : Introduc;
       'E' : Extrag;
       'A' : Afis;
       'O' :
       else writeln('Opţiune necunoscută')
   end;
 until c='O';
end.
