00001
00002 #include <cassert>
00003 #include <cstddef>
00004 #include <stdexcept>
00005 #include <string>
00006 #include <new>
00007
00008 class StackError : public logic_error
00009 {
00010 public:
00011 StackError(const string& s)
00012 : logic_error(s)
00013 {}
00014 };
00015
00016 template<typename T>
00017 class Stack
00018 {
00019 public:
00020 Stack(size_t) throw(StackError, bad_alloc);
00021 ~Stack();
00022
00023 void push(const T&) throw(StackError);
00024 T pop() throw(StackError);
00025 T top() const throw(StackError);
00026 size_t size() const;
00027
00028 private:
00029 T* data;
00030 size_t max;
00031 size_t ptr;
00032 };
00033
00034 template<typename T>
00035 inline Stack<T>::~Stack()
00036 {
00037 delete [] data;
00038 max = ptr = 0;
00039 }
00040
00041 template<typename T>
00042 inline size_t Stack<T>::size() const
00043 {
00044 return ptr;
00045 }
00046
00047 template<typename T>
00048 Stack<T>::Stack(size_t siz) throw(StackError, bad_alloc)
00049 {
00050 if (siz == 0)
00051 throw StackError("bad size in Stack(size_t)");
00052 data = new T[siz];
00053 max = siz;
00054 ptr = 0;
00055 }
00056
00057 template<typename T>
00058 void Stack<T>::push(const T& x) throw(StackError)
00059 {
00060 if (ptr == max)
00061 throw StackError("stack overflow");
00062
00063 assert(ptr < max);
00064 data[ptr++] = x;
00065 }
00066
00067 template<typename T>
00068 T Stack<T>::pop() throw(StackError)
00069 {
00070 if (ptr == 0)
00071 throw StackError("stack underflow");
00072 return data[--ptr];
00073 }
00074
00075 template<typename T>
00076 T Stack<T>::top() const throw(StackError)
00077 {
00078 if (ptr == 0)
00079 throw StackError("stack underflow");
00080 return data[ptr - 1];
00081 }
00082