当前位置:C++技术网 > 资讯 > 使用C++模板实现栈

使用C++模板实现栈

更新时间:2015-06-23 22:57:08浏览次数:1+次

    这些代码需要在一个头文件中,类成员函数独立放在一个文件中需要编译器支持export关键字。
    栈底指针指向栈的第一个元素且只指向这个元素,如果栈顶和栈底指针重合则栈空,如果栈顶指针与栈底指针偏移量为栈构件时的给定的大小,则栈满。

#include <iostream>
using namespace std;

template<class T>
class Stack
{
protected:
    T * m_pButtom,*m_pTop;//栈底和栈顶指针
    int m_ItemNum;//栈大小
public:
    Stack(int ItemNum=20);//默认构造20个元素大小的栈
    ~Stack();
    T Pop();//弹出最顶元素,指针下移
    void Push(const T Item);//压入栈中一个元素
    bool IsEmpty(){return m_pButtom==m_pTop;};//栈是否为空
    bool IsFull(){return m_pTop - m_pButtom==m_ItemNum;}//栈是否已满
};

template<class T>
Stack<T>::Stack(int ItemNum)
{
    m_pButtom = m_pTop =NULL;
    m_ItemNum = ItemNum;
    m_pButtom = (T*)malloc(ItemNum*sizeof(T));
    if (!m_pButtom)
    {
        cerr<<"allocate memory failed!\n";
        m_ItemNum = 0;
        return;
    }
    memset(m_pButtom,0,ItemNum);
    m_pTop = m_pButtom;
}

template<class T>
Stack<T>::~Stack()
{
    if (m_pButtom)
    {
        delete m_pButtom;
        m_pButtom = m_pTop=NULL;
        m_ItemNum=0;
    }
}
template<class T>
T Stack<T>::Pop()
{
    if (!IsEmpty())
    {
        --m_pTop;
        T temp = *m_pTop;
        return temp;
    }
    return 0;
}

template<class T>
void Stack<T>::Push(const T Item)
{
    if (!IsFull())
    {
        *m_pTop = Item;
        ++m_pTop;
    }
}