// templatestack.cc // Routines to implement a LIFO stack of arbitrary things. // // The stack is represented as an array; we return an error // if the caller tries to push more things onto the stack than we have // room for. // // Copyright (c) 1992,1993,1995 The Regents of the University of California. // All rights reserved. See copyright.h for copyright notice and limitation // of liability and disclaimer of warranty provisions. extern "C" { #include #define ASSERT(expression) assert(expression) } #include #include "copyright.h" #include "templatestack.h" //---------------------------------------------------------------------- // Stack::Stack // The constructor for the Stack class. Note that it doesn't have a // return type. // // "sz" -- maximum number of elements on the Stack at any time //---------------------------------------------------------------------- template Stack::Stack(int sz) { ASSERT(sz >= 1); // Initialize the data members of the stack object. size = sz; top = 0; stack = new T[size]; // allocate an array of integers. } //---------------------------------------------------------------------- // Stack::~Stack // The destructor for the Stack class. Just get rid of the array we // allocated in the constructor. //---------------------------------------------------------------------- template Stack::~Stack() { delete [] stack; } //---------------------------------------------------------------------- // Stack::Push // Put a T on the top of the stack; error on overflow. // // "value" -- the value to put on the stack //---------------------------------------------------------------------- template void Stack::Push(T value) { ASSERT(!Full()); stack[top++] = value; } //---------------------------------------------------------------------- // Stack::Pop // Remove a T from the top of the stack, returning its value. // Error if the stack is empty. //---------------------------------------------------------------------- template T Stack::Pop() { ASSERT(!Empty()); return (stack[--top]); } //---------------------------------------------------------------------- // Stack::Full // Return TRUE if the stack has no more room. //---------------------------------------------------------------------- template bool Stack::Full() { return (top == size); } //---------------------------------------------------------------------- // Stack::Empty // Return TRUE if the stack has nothing on it. //---------------------------------------------------------------------- template bool Stack::Empty() { return (top == 0); } //---------------------------------------------------------------------- // Stack::SelfTest // Test our stack implementation by pushing 10 T's onto the // stack, and then print them as it pops them off. //---------------------------------------------------------------------- template void Stack::SelfTest(T start) { T count = start; // Put a bunch of stuff in the stack... while (!Full()) { cout << "pushing " << count << "\n"; Push(count++); } // ... and take it out again. while (!Empty()) { cout << "popping " << Pop() << "\n"; } } //---------------------------------------------------------------------- // main // Run the test code for the stack implementation. //---------------------------------------------------------------------- int main() { Stack *s1 = new Stack(10); Stack *s2 = new Stack(10); cout << "Testing Stack\n"; s1->SelfTest(17); cout << "Testing Stack\n"; s2->SelfTest('a'); delete s1; // always delete what you allocate delete s2; // always delete what you allocate return 0; }