第34课 - 栈的概念及实现(上)

1、栈的概念及实现 

         栈的定义 

                -栈是—种特殊的线性表 

                -栈仅能在线性表的—端进行操作

                        栈顶(Top) : 允许操作的—端 

                        栈底(Bottom) : 不允许操作的—端 

      

          栈的特性 

                - 后进先出( Last In First Out



            栈的操作 

                -创建栈( Stack() ) 

                 - 销毁栈( ~Stack() ) 

                -清空栈( clear() ) 

                -进栈( push() )  

                -出栈( pop() ) 

                -获取栈顶元素( top() ) 

                -获取栈的大小( size() )        


            栈的实现 

                             

        


            栈的顺序实现 



            StaticStack设计要点 

                 - 类模板 

                        使用原生数组作为栈的存储空间 

                        使用模板参数决定栈的 最大容量 

        


2、编程实验 

基于顺序存储结构的栈     StaticStack.h

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 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()
    {
        m_top = -1;
        m_size = 0;
    }
    int capacity() const
    {
        return N;
    }
    void push(const T& e)
    {
        if(m_size < N)
        {
            m_space[m_top+1] = e;       //T可能是类类型,保证异常安全
            m_top++;
            m_size++;
        }
        else
        {
            THROW_EXCEPTION(InvalidParameterException,"No space in current stack ...");
        }
    }
    void pop()
    {
        if(m_size > 0)
        {
            m_top--;
            m_size--;
        }
        else
        {
            THROW_EXCEPTION(InvalidParameterException,"No element in current stack ...");
        }
    }
    T top() const
    {
        if(m_size > 0)
        {
            return m_space[m_top];
        }
        else
        {
            THROW_EXCEPTION(InvalidParameterException,"No element in current stack ...");
        }
    }

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

    int size() const
    {
        return m_size;
    }

};
}
#endif // STATICSTACK_H

main.cpp

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

using namespace std;
using namespace DTLib;


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

    try
    {
        stack.pop();
    }
    catch(const Exception& e)
    {
        cout<<e.message()<<endl;
        cout<<e.location()<<endl;
    }

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

    while(stack.size() > 0)
    {
        cout<<stack.top()<<" ";

        stack.pop();
    }




    return 0;
}

                            


3、小结 

            栈是—种特殊的线性表 

            栈只允许在线性表的—端进行操作 

            StaticStack使用原生数组作为内部存储空间 

            StaticStack的最大容量由模板参数决定 



猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/80329260