In Modula-2, the implementation of the stack class could look like:
IMPLEMENTATION MODULE IntStacks; (* IntStacks; array implementation *) FROM Storage IMPORT Available, Allocate, Deallocate; CONST MaxSize = 10; TYPE IntStack = POINTER TO IntStackInstance; IntStackInstance = RECORD top : CARDINAL [0..MaxSize]; stack: ARRAY [1..MaxSize] OF INTEGER; END; PROCEDURE Push(VAR S: IntStack; e: INTEGER); BEGIN WITH S^ DO INC(top); stack[top] := e END END Push; PROCEDURE Pop(VAR S: IntStack; VAR e: INTEGER); BEGIN WITH S^ DO e := stack[top]; DEC(top) END END Pop; PROCEDURE Empty(S: IntStack): BOOLEAN; BEGIN RETURN (S^.top = 0) END Empty; PROCEDURE Full(S: IntStack): BOOLEAN; BEGIN RETURN (S^.top = MaxSize) END Full; PROCEDURE Create(VAR S: IntStack): BOOLEAN; BEGIN IF Available(SIZE(IntStackInstance)) THEN Allocate(S, SIZE(IntStackInstance)); S^.top := 0; RETURN TRUE ELSE RETURN FALSE END END Create; PROCEDURE Terminate(VAR S: IntStack); BEGIN Deallocate(S, SIZE(IntStackInstance)); END Terminate; END IntStacks.
In C++, the implementation could look like:
// intstack.cc #include "intstack.h" const int maxsize = 10; intstack::intstack() { top_ = 0; stack_ = new int[maxsize]; } intstack::~intstack() { top_ = 0; delete[] stack_; } void intstack::push(int element) { stack_[top_] = element; top_++; } void intstack::pop(int& element) { top_--; element = stack_[top_]; } bool intstack::empty() { return (top_ == 0); } bool intstack::full() { return (top_ == maxsize); }
The #include "intstack.h"
is needed because a class has to be defined
before the implementation can be understood by the compiler.
The rest of the implementation is just C++ code.
Any program that wants to use the stack class, has to include the header file in the source and has to link in the object file of the stack implementation.