栈的思想在于,着眼于解决刚刚碰到的问题,而将之前碰到的问题先保存下来,放到后面去解决。
比如经典的括号匹配问题就可以用栈来解决。
栈模板的代码实现 放在一个头文件中
#ifndef MYSTACK_H
#define MYSTACK_H
template <typename T>
class MyStack
{
public:
MyStack(int size);// 复杂对象的栈需要有默认构造函数
~MyStack();
bool stackEmpty();
bool stackFull();
void clearStack();
int stackLength();
bool push(T elem);
bool pop(T &elem);
void stackTraverse(bool FromButtom);//遍历栈中所有元素
private:
T *m_pBuffer; //栈空间指针
int m_iSize;
int m_iTop;
};
template <typename T>
MyStack<T>::MyStack(int size)
{
m_iSize = size;
m_pBuffer = new T[size]; // 复杂对象的栈需要有默认构造函数
m_iTop = 0;
}
template <typename T>
MyStack<T>::~MyStack()
{
delete[]m_pBuffer;
}
template <typename T>
bool MyStack<T>::stackEmpty()
{
if (0 == m_iTop)
{
return true;
}
return false;
}
template <typename T>
void MyStack<T>::clearStack()
{
m_iTop = 0;
}
template <typename T>
bool MyStack<T>::stackFull()
{
if (m_iTop == m_iSize)
{
return true;
}
return false;
}
template <typename T>
int MyStack<T>::stackLength()
{
return m_iTop;
}
template <typename T>
bool MyStack<T>::push(T elem)
{
if (stackFull())
{
return false;
}
m_pBuffer[m_iTop] = elem;
m_iTop++;
return true;
}
template <typename T>
bool MyStack<T>::pop(T &elem)
{
if (stackEmpty())
{
return false;
}
m_iTop--;
elem = m_pBuffer[m_iTop];
return true;
}
template <typename T>
void MyStack<T>::stackTraverse(bool FromButtom)
{
if (FromButtom)
{
for (int i(0); i < m_iTop; ++i)
{
cout << m_pBuffer[i] << endl;
// 类模板要使用通用的输出函数
}
}
else
{
for (int i(m_iTop - 1); i >= 0; i--)
{
cout << m_pBuffer[i];
}
}
}
#endif