verem.ads

generic 
   type elem is private
 
package verem is 
   subtype int is integer range 1..100
   type stack(size : int := 10is private
    
   STACK_FULL : exception
   STACK_EMPTY : exception
       
   procedure pop(s : in out stack; e : out elem); 
   procedure push(s : in out stack; e : in elem); 
   procedure top(s : in stack; e : out elem); 
   function isEmpty(s : in stack) return boolean; 
   function isFull(s : in stack) return boolean; 
    
private    
   type stack_vect is array(int range <>) of elem; 
   type stack(size : int := 10is record 
      v : stack_vect(1..size); 
      i : integer := 0
   end record
end verem; 

verem.adb

package body verem is 
 
   procedure pop(s : in out stack; e : out elem) is 
   begin 
      if s.i < 1 then 
         raise STACK_EMPTY; 
      end if
      e := s.v(s.i); 
      s.i := s.i - 1
   end pop; 
    
   procedure push(s : in out stack; e : in elem) is 
   begin 
      if s.i = s.size then 
         raise STACK_FULL; 
      end if
      s.i := s.i + 1
      s.v(s.i) := e; 
   end push; 
    
   --ezt irhattuk volna fuggvenykent is 
   procedure top(s : in stack; e : out elem) is 
   begin 
      e := s.v(s.i); 
   end top; 
    
   function isEmpty(s : in stack) return boolean is 
   begin 
      return s.i = 0
   end isEmpty; 
    
   function isFull(s : in stack) return boolean is 
   begin 
      return s.i = s.size; 
   end isFull; 
 
end verem; 

mainverem.adb

with ada.text_io, verem; 
use ada.text_io; 
 
procedure mainverem is 
   package iverem is new verem(integer); 
   use iverem; 
   s : stack(15); 
   e : integer; 
begin 
   for i in 1..15 loop 
      push(s,i); 
   end loop
    
   for i in 1..15 loop 
      pop(s,e); 
      put_line(integer'image(e)); 
   end loop;   
    
exception 
   when STACK_FULL => put_line("HIBA!! A verem tele"); 
   when STACK_EMPTY => put_line("HIBA!! A verem ures");    
end mainverem;
 
 
VISSZA