#include <iostream>
using namespace std;
template<typename T>
class CStack
{
protected:
T* m_pData;
int m_nLength; // 栈长度
int m_nCount; // 当前元素个数
public:
CStack(int nSize);
~CStack();
void Push(const T& val); // 入栈操作
void Pop(); // 出栈操作
const T& Top() const; // 获取栈顶元素
};
template<typename T>
CStack<T>::CStack(int nSize)
{
m_pData = new T[nSize];
if(!m_pData)
{
cout<<"分配内存失败。"<<endl;
exit(1);
}
m_nLength = nSize;
m_nCount = 0;
}
template<typename T>
CStack<T>::~CStack()
{
if (m_pData)
{
delete[] m_pData;
m_pData = NULL;
}
}
template<typename T>
void CStack<T>::Push(const T& val)
{
if (m_nCount == m_nLength)
{
cout<<"堆栈已满。"<<endl;
return;
}
m_pData[m_nCount] = val;
m_nCount++;
}
template<typename T>
void CStack<T>::Pop()
{
if (m_nCount == 0)
{
cout<<"堆栈已空。"<<endl;
return;
}
m_nCount--;
}
template<typename T>
const T& CStack<T>::Top() const
{
if (m_nCount == 0)
{
cout<<"堆栈已空。"<<endl;
return 0;
}
return m_pData[m_nCount-1];
}
///
int main(int argc, char* argv[])
{
CStack<char> stkChar(3);
CStack<double> stkDouble(3);
char chCurrent;
double dCurrent;
// 初始化
stkChar.Push('a');
stkChar.Push('b');
stkDouble.Push(1.2);
stkDouble.Push(2.4);
// 字符堆栈
chCurrent = stkChar.Top();
cout<<chCurrent<<endl;
stkChar.Pop();
chCurrent = stkChar.Top();
cout<<chCurrent<<endl;
stkChar.Pop();
stkChar.Top(); // 堆栈已空
// 浮点数堆栈
dCurrent = stkDouble.Top();
cout<<dCurrent<<endl;
stkDouble.Pop();
dCurrent = stkDouble.Top();
cout<<dCurrent<<endl;
stkDouble.Pop();
stkDouble.Pop(); // 堆栈已空
return 0;
}