-- This is the generic specification for a stack abstract data type. -- Usage: Put these lines in the client (in the appropriate place): -- with StackPkg; -- this statement precedes client procedure declaration -- -- -- the next 2 statements go inside the client procedure -- -- the next 2 statements go after MyType is declared -- package MyStkPkg is new StackPkg(Size => 100; ItemType => MyType); -- use MyStkPkg; generic -- Generic parameters are declared here Size : Positive; -- Size of stack to create type ItemType is private; -- Type of elements that stack will contain package StackPkg is type Stack is limited private; Stack_Empty: exception; -- Raised if do top or pop on an empty stack Stack_Full : exception; -- Raised if push onto full stack -- Determine if stack is empty or full function isEmpty (s : Stack) return Boolean; function isFull (s : Stack) return Boolean; -- Put element Item onto Stack s procedure push (item : ItemType; s : in out Stack) with pre => not isFull(s) or else raise Stack_Full; -- Remove an element from Stack s procedure pop (s : in out Stack) with pre => not isEmpty(s) or else raise Stack_Empty; -- Return top element from Stack s function top (s : Stack) return ItemType with pre => not isEmpty(s) or else raise Stack_Empty; private type StackElements is array(1 .. Size) of ItemType; type Stack is record Elements : StackElements; Top : Natural range 0 .. Size := 0; end record; end StackPkg;