栈的定义

  • 栈是一种特殊的线性表
  • 栈仅能在线性表的一端进行操作

    • 栈顶(Top):允许操作的一端
    • 栈底(Bottom):不允许操作的一端

栈的特性

  • 后进先出 (Last In first Out)

image.png

栈的操作

  • 创建栈 (Stack())
  • 销毁栈 (~Stack())
  • 清空栈 (clear())
  • 进栈 (push())
  • 出栈 (pop())
  • 获取栈顶元素 (top())
  • 获取栈大小 (size())

栈的实现

image.png

template <typename T>
class Stack : Object
{
public:
    virtual void push(const T &e) = 0;
    virtual void pop() = 0;
    virtual T top() const = 0;
    virtual void clear() = 0;
    virtual int size() const = 0;
};

栈的顺序实现

image.png

StaticStack 设计要点

  • 类模板

    • 使用原生数组作为栈的存储空间
    • 使用模板参数决定栈的最大容量
template <typename T, int N>
class StaticStack : public Stack<T>
{
public:
    StaticStack();          // 初始化成员变量
    int capacity() const;  
protected:
    T m_space[N];           // 栈存储空间,N为模板参数
    int m_top;              // 栈顶标识
    int m_size;             // 当前栈的大小
};

编程实验:基于顺序存储结构的栈

文件:Stack.h

#ifndef STACK_H
#define STACK_H

#include "Object.h"

namespace DTLib
{

template <typename T>
class Stack : public Object
{
public:
    virtual void push(const T &e) = 0;
    virtual void pop() = 0;
    virtual T top() const = 0;
    virtual void clear() = 0;
    virtual int size() const = 0;
};

}

#endif // STACK_H

文件:StaticStack.h

#ifndef STAITCSTACK_H
#define STAITCSTACK_H

#include "Stack.h"
#include "Exception.h"

namespace DTLib
{

template <typename T, int N>
class StaticStack : public Stack<T>
{
public:
    StaticStack() = default;

    int capacity() const  // O(1)
    {
        return N;
    }

    void push(const T &e) override  // O(1)
    {
        if (m_size < N)
        {
            m_space[m_top + 1] = e;

            ++m_top;
            ++m_size;
        }
        else
        {
            THROW_EXCEPTION(InvalidOpertionExcetion, "No enough space to push StaticStack ...");
        }
    }

    void pop() override  // O(1)
    {
        if (m_size > 0)
        {
            --m_top;
            --m_size;
        }
        else
        {
            THROW_EXCEPTION(InvalidOpertionExcetion, "No element to pop StaticStack ...");
        }
    }

    T top() const override  // O(1)
    {
        if (m_size > 0)
        {
            return m_space[m_top];
        }
        else
        {
            THROW_EXCEPTION(InvalidOpertionExcetion, "No element in current StaticStack ...");
        }
    }

    void clear() override  // O(1)
    {
        m_top = -1;
        m_size = 0;
    }

    int size() const override  // O(1)
    {
        return m_size;
    }

    ~StaticStack()  // O(1)
    {
        clear();
    }

protected:
    T m_space[N];
    int m_top = -1;
    int m_size = 0;
};

}

#endif // STAITCSTACK_H

文件:main.cpp

#include <iostream>
#include "StaitcStack.h"

using namespace std;
using namespace DTLib;

int main()
{
    StaticStack<int, 5> stack;

    for (int i=0; i<5; ++i)
    {
        stack.push(i);
    }

    while (stack.size() > 0)
    {
        cout << stack.top() << endl;
        stack.pop();
    }

    return 0;
}

输出:

4
3
2
1
0

小结

  • 栈是一种特殊的线性表
  • 栈只允许在线性表的一端进行操作
  • StaticStack 使用原生数组作为内存存储空间
  • StaticStack 的最大容量由模板参数决定

以上内容整理于狄泰软件学院系列课程,请大家保护原创!


TianSong
734 声望138 粉丝

阿里山神木的种子在3000年前已经埋下,今天不过是看到当年注定的结果,为了未来的自己,今天就埋下一颗好种子吧