67 lines
1.3 KiB
Plaintext
67 lines
1.3 KiB
Plaintext
MODULE Stacks;
|
|
IMPORT
|
|
Object,
|
|
Object:Boxed,
|
|
Out := NPCT:Console;
|
|
|
|
TYPE
|
|
Pool(E: Object.Object) = POINTER TO ARRAY OF E;
|
|
Stack*(E: Object.Object) = POINTER TO StackDesc(E);
|
|
StackDesc*(E: Object.Object) = RECORD
|
|
pool: Pool(E);
|
|
cap-,top: LONGINT;
|
|
END;
|
|
|
|
PROCEDURE (s: Stack(E)) INIT*(cap: LONGINT);
|
|
BEGIN
|
|
NEW(s.pool,cap);s.cap := cap;s.top := -1
|
|
END INIT;
|
|
|
|
PROCEDURE (s: Stack(E)) Top*(): E;
|
|
BEGIN
|
|
RETURN s.pool[s.top]
|
|
END Top;
|
|
|
|
PROCEDURE (s: Stack(E)) Push*(e: E);
|
|
BEGIN
|
|
INC(s.top);
|
|
ASSERT(s.top < s.cap);
|
|
s.pool[s.top] := e;
|
|
END Push;
|
|
|
|
PROCEDURE (s: Stack(E)) Pop*(): E;
|
|
VAR
|
|
resp: E;
|
|
BEGIN
|
|
ASSERT(s.top >= 0);
|
|
resp := s.pool[s.top];DEC(s.top);
|
|
RETURN resp
|
|
END Pop;
|
|
|
|
PROCEDURE (s: Stack(E)) IsEmpty(): BOOLEAN;
|
|
BEGIN
|
|
RETURN s.top < 0
|
|
END IsEmpty;
|
|
|
|
PROCEDURE (s: Stack(E)) Size*(): LONGINT;
|
|
BEGIN
|
|
RETURN s.top + 1
|
|
END Size;
|
|
|
|
PROCEDURE Test;
|
|
VAR
|
|
s: Stack(Boxed.LongInt);
|
|
BEGIN
|
|
s := NEW(Stack(Boxed.LongInt),100);
|
|
s.Push(NEW(Boxed.LongInt,10));
|
|
s.Push(NEW(Boxed.LongInt,100));
|
|
Out.String("size: ");Out.Int(s.Size(),0);Out.Ln;
|
|
Out.String("pop: ");Out.Object(s.Pop());Out.Ln;
|
|
Out.String("top: ");Out.Object(s.Top());Out.Ln;
|
|
Out.String("size: ");Out.Int(s.Size(),0);Out.Ln
|
|
END Test;
|
|
|
|
BEGIN
|
|
Test
|
|
END Stacks.
|