栈的顺序存储结构 -- C++使用类模板实现

栈是先进后出的线性表。即限定只能在表的一段进行插入和删除操作的线性表。

栈结构在计算机中有广泛的应用。常见的软件的”撤销”和”恢复”功能就是用栈实现的。

栈的顺序存储结构示例代码

template<typename T>
class SqStack
{
public:
    SqStack(int k = 1);
    ~SqStack(){ delete[]m_base; }
    void Clear() { m_top = m_base; }
    bool Empty() const { return m_top == m_base; }
    int Length() const { return m_top - m_base; }
    T Top() const;
    bool Push(T elem);
    bool Pop();
    void Display();
private:
    T *m_base;      //栈存储空间的基址
    T *m_top;           //栈顶指针
    int m_size; //栈当前的存储容量
};

template<typename T>
SqStack<T>::SqStack(int k = 1)
{
    m_base = new T[k];
    if (nullptr == m_base)
    {
        cout << "申请空间失败" << endl;
        return;
    }

    m_top = m_base;
    m_size = k;
}

template<typename T>
T SqStack<T>::Top() const       //返回栈顶元素
{
    if (m_top > m_base) //栈不为空
    {
        return *(m_top-1);      //返回栈顶元素 为什么要减1? <== [base, top)
    }
    else
    {
        return false;
    }
}

template<typename T>
bool SqStack<T>::Push(T elem)
{
    if (m_top - m_base == m_size)   //栈满,需要重新申请空间
    {
        T *newbase = new T[m_size * 2];
        if (nullptr == newbase)
        {
            return false;
        }

        for (int i = 0; i < m_top - m_base; ++i)        //将原本的数据复制到新的内存中
        {
            *(newbase + i) = *(m_base + i);
        }
        delete []m_base;        //释放旧数据的内存

        m_base = newbase;   //将基址指针指向新的内存
        m_top = m_base + m_size;    //将栈顶指针指向新的栈顶地址
        m_size *= 2;                //更新栈顶大小
    }

    *m_top = elem;      //将元素赋给栈顶
    m_top++;                //栈顶指针自增

    return true;
}

template<typename T>
bool SqStack<T>::Pop()
{
    if (m_top == m_base)        //判断栈是否为空
    {
        return false;
    }

    --m_top;        //若不为空,将栈顶指针自减1

    return true;

}

template<typename T>
void SqStack<T>::Display()
{
    T *temp = m_base;

    while (temp < m_top)
    {
        cout << *temp++ << " ";
    }
    cout << endl;
}

测试程序:

int main()
{
    SqStack<int> s;
    cout << s.Empty() << endl;
    for (int i = 1; i < 10; ++i)
    {
        s.Push(i);
    }

    cout << s.Top() << endl;

    s.Pop();

    s.Display();

    system("pause");
    return 0;
}

运行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Zhoujy1996/article/details/80806639