美文网首页
34_栈的概念及实现(上)

34_栈的概念及实现(上)

作者: 编程半岛 | 来源:发表于2018-07-12 16:45 被阅读8次

关键词:栈的定义、栈的操作、栈的实现、StaticStack.h的实现

0. 栈的定义

  • 栈是一种特殊的线性表
  • 栈仅能在线性表的一端进行操作
    栈顶(Top):允许操作的一端
    栈底(Bottom):不允许操作的一端

1. 栈的特性

后进先出(Last In First Out)

栈的特性示意图

2. 栈的操作

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

3. 栈的实现

栈的继承关系图

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

4. 栈的顺序实现

StaticStack示意图
  • StaticStack设计要点:
    • 类模板
    • 使用原生数组作为栈的存储空间
    • 使用模板参数决定栈的最大容量

StaticStack.h

#ifndef STATICSTACK_H
#define STATICSTACK_H

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

namespace DTLib
{

template < typename T, int N >
class StaticStack : public Stack<T>
{
protected:
    T m_space[N];
    int m_top;
    int m_size;
public:
    StaticStack();
    void push (const T& e);
    void pop();
    T top() const;
    void clear();
    int size() const;
    int capacity() const;
};

template < typename T, int N >
StaticStack<T,N>::StaticStack()
{
    m_top = -1;
    m_size = 0;
}

template < typename T, int N >
void StaticStack<T,N>::push (const T& e)
{
    if( m_size < N )
    {
        m_space[m_top + 1] = e;     // 异常安全:保证赋值完全正确后,将m_top自增
        ++ m_top;
        ++m_size;
    }
    else
    {
        THROW_EXCEPTION(InvalidOperationExcetion, "No space in current stack ...");
    }
}

template < typename T, int N >
void StaticStack<T,N>::pop()
{
    if( m_size > 0)
    {
        --m_top;
        --m_size;
    }
    else
    {
        THROW_EXCEPTION(InvalidOperationExcetion, "No element in current stack ...");
    }
}

template < typename T, int N >
T StaticStack<T,N>::top() const
{
    if( m_size > 0)
    {
        return m_space[m_top];
    }
    else
    {
        THROW_EXCEPTION(InvalidOperationExcetion, "No element in current stack ...");
    }
}

template < typename T, int N >
void StaticStack<T,N>::clear()
{
    m_top = -1;
    m_size = 0;
}

template < typename T, int N >
int StaticStack<T,N>::size() const
{
    return m_size;
}

template < typename T, int N >
int StaticStack<T,N>::capacity() const
{
    return N;
}

}

#endif // STATICSTACK_H

5. 小结

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

声明:此文章仅是本人在学习狄泰学院《数据结构实战开发教程》所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4

相关文章

网友评论

      本文标题:34_栈的概念及实现(上)

      本文链接:https://www.haomeiwen.com/subject/ofcrpftx.html