stack implement C++
Stack Source Code in C++
Special thanks to Eric Suh for contributing the following
implementation of a stack. This implementation uses templates to
faciliate generic programming.
/ *
-------------------------------------------------------------------
|
|
|
Stack Class
|
|
===========================================================
|
|
This Stack has been implemented with templates to
allow it |
|
to accomodate virtually any data type, and the
size of the |
|
Stack is determined dynamically at runtime.
|
|
|
|
There is also a new function: peek(), which,
given a whole |
|
number 'Depth', returns the Stack element which
is 'Depth' |
|
levels from the top.
|
|
|
-------------------------------------------------------------------
*/
#ifndef __StackClassH__
#define __StackClassH__
#include <assert.h>
// For error-checking
purposes
//-------------------------------------------------
// Main structure of Stack Class:
//-------------------------------------------------
template <class Elem>
class Stack
{
public:
Stack(int
MaxSize=500);
Stack(const
Stack<Elem>
&OtherStack);
~Stack(void);
inline void
Push(const Elem &Item); // Adds
Item to the top
inline Elem
Pop(void);
// Returns Item from the
top
inline const Elem
&Peek(int Depth) const; // Peek a
depth downwards
protected:
Elem
*Data;
// The
actual Data array
int
CurrElemNum;
// The current number of
elements
const int MAX_NUM;
// Maximum number of elements
};
//-------------------------------------------------
// Implementation of Stack Class:
//-------------------------------------------------
// Stack Constructor function
template <class Elem>
Stack<Elem>::Stack(int MaxSize)
:
MAX_NUM( MaxSize )
// Initialize the
constant
{
Data = new Elem[MAX_NUM];
CurrElemNum = 0;
}
// Stack Destructor function
template <class Elem>
Stack<Elem>::~Stack(void)
{
delete[] Data;
}
// Push() function
template <class Elem>
inline void
Stack<Elem>::Push(const Elem
&Item)
{
// Error Check: Make sure we aren't
exceeding the maximum storage space
assert(CurrElemNum <
MAX_NUM);
Data[CurrElemNum++] = Item;
}
// Pop() function
template <class Elem>
inline Elem
Stack<Elem>::Pop(void)
{
// Error Check: Make sure we aren't popping
from an empty Stack
assert(CurrElemNum >
0);
return Data[--CurrElemNum];
}
// Peek() function
template <class Elem>
inline const Elem
&Stack<Elem>::Peek(int
Depth) const
{
// Error Check: Make sure the depth doesn't
exceed the number of elements
assert(Depth <
CurrElemNum);
return Data[ CurrElemNum - (Depth + 1)
];
}
#endif