首页 > 代码库 > 第34课 栈的概念及实现(上)

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

1. 栈的概念

(1)栈是一种特殊的线性表

(2)栈仅能在线性表的一端进行操作

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

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

(3)栈的特性——后进先出Last In First Out

技术分享 

2. 栈的操作

(1)创建栈(Stack())

(2)销毁栈(~Stack())

(3)清空栈(clear())

(4)进栈(push())

(5)出栈(pop())

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

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

3. 栈的定义与实现

(1)栈的定义

技术分享 

(2)栈的顺序实现

技术分享 

(3)Static设计要点

技术分享 

  ①使用类模板实现。

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

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

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

//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& elem) = 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]; //栈存储空间,N为模板参数
    int m_top;    //栈顶标识
    int m_size;   //当前栈的大小
public:
    StaticStack()   //O(1)
    {
        m_top = -1;
        m_size = 0;
    }

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

    void push(const T& elem)  //O(1)
    {
        if(m_size < N){
            //要注意确保异常安全,即如果T类的“=”操作符发生异常时
            //m_top和m_size没被改变。
            m_space[m_top + 1] = elem;
            m_top++;
            m_size++;
        }else{
            THROW_EXCEPTION(InvalidOperationException, "No space in current stack ...");
        }
    }

    void pop()  //O(1)
    {
        if(m_size > 0){
            m_top--;
            m_size--;
        }else{
            THROW_EXCEPTION(InvalidOperationException, "No element in current stack ...");
        }
    }

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

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

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

};

}

#endif // _STATICSTACK_H_

//main.cpp

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

using namespace std;
using namespace DTLib;

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

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

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

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

    cout << endl;

    return 0;
}
/*输出结果
No element in current stack ...
..\DTLib\StaticStack.h:48
9 8 7 6 5 4 3 2 1 0
*/

4. 小结

(1)栈是一种特殊的线性表

(2)栈只允许在线性表的一端进行操作

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

(4)StaticStack的最大容量由模板参数决定。

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