Mega Code Archive

 
Categories / C++ Tutorial / Template
 

Max size as the parameter for a generic stack

/* The following code example is taken from the book  * "C++ Templates - The Complete Guide"  * by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002  *  * (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.  * Permission to copy, use, modify, sell and distribute this software  * is granted provided this copyright notice appears in all copies.  * This software is provided "as is" without express or implied  * warranty, and with no claim as to its suitability for any purpose.  */ #include <iostream> #include <string> #include <cstdlib> #include <stdexcept> template <typename T, int MAXSIZE> class Stack {   private:     T elems[MAXSIZE];        // elements     int numElems;            // current number of elements   public:     Stack();                  // constructor     void push(T const&);      // push element     void pop();               // pop element     T top() const;            // return top element     bool empty() const {      // return whether the stack is empty         return numElems == 0;     }     bool full() const {       // return whether the stack is full         return numElems == MAXSIZE;     } }; // constructor template <typename T, int MAXSIZE> Stack<T,MAXSIZE>::Stack ()   : numElems(0)               // start with no elements {     // nothing else to do } template <typename T, int MAXSIZE> void Stack<T,MAXSIZE>::push (T const& elem) {     if (numElems == MAXSIZE) {         throw std::out_of_range("Stack<>::push(): stack is full");     }     elems[numElems] = elem;   // append element     ++numElems;               // increment number of elements } template<typename T, int MAXSIZE> void Stack<T,MAXSIZE>::pop () {     if (numElems <= 0) {         throw std::out_of_range("Stack<>::pop(): empty stack");     }     --numElems;               // decrement number of elements } template <typename T, int MAXSIZE> T Stack<T,MAXSIZE>::top () const {     if (numElems <= 0) {         throw std::out_of_range("Stack<>::top(): empty stack");     }     return elems[numElems-1];  // return last element } int main() {     try {         Stack<int,20>         int20Stack;     // stack of up to 20 ints         Stack<int,40>         int40Stack;     // stack of up to 40 ints         Stack<std::string,40> stringStack;    // stack of up to 40 strings         // manipulate stack of up to 20 ints         int20Stack.push(7);         std::cout << int20Stack.top() << std::endl;         int20Stack.pop();         // manipulate stack of up to 40 strings         stringStack.push("hello");         std::cout << stringStack.top() << std::endl;         stringStack.pop();     }     catch (std::exception const& ex) {         std::cerr << "Exception: " << ex.what() << std::endl;         return EXIT_FAILURE;  // exit program with ERROR status     } } 7 hello Exception: Stack::pop(): empty stack