• 数据结构库——顺序栈的概念及实现


    1,栈的定义:

           1,栈是一种特殊的线性表;

           2,栈仅能在线性表的一端进行操作:

                  1,栈顶(Top):允许操作的一端;

                  2,栈底(Bottom):不允许操作的一端;

                 

    2,栈的特性:

       

           1,后进先出(Last In First Out)(只有一个特性);

          

    3,栈的操作(创销进出顶大清):

           1,创建栈(Stack());

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

           3,进栈(push());

           4,出栈(pop());

           5,获取栈顶元素(top());

           6,获取栈的大小(size());

           7,清空栈(clear())(栈是容器,实际生活中也有);

          

    4,栈的实现:

          

    5,栈的顺序实现:

      

          

    6,StaticStack 设计要点:

           1,模板类:

                  1,使用原生数组作为栈的存储空间(顺序栈的设计核心);

                  2,使用模板参数决定栈的最大空间;

                    

    7,基于顺序存储结构的栈 StaticStack 的实现:

     1 #ifndef STATICSTACK_H
     2 #define STATICSTACK_H
     3 
     4 #include "Stack.h"
     5 #include "Exception.h"
     6 
     7 namespace DTLib
     8 {
     9 
    10 template <typename T, int N>
    11 class StaticStack : public Stack<T>
    12 {
    13 protected:
    14     T m_space[N];  // 栈存储空间, N为模板参数;顺序存储,所以要原生数组;如果生成对象为类,即使没有存储数据(m_size = 0),也会调用构造函数和析构函数,此时不高效;因为原生数组作为存储空间的时候,在创建栈对象的时候,会调用对应的泛指类型的构造函数;
    15     int m_size;   // 当前栈大小
    16    int m_top;    // 栈顶标识,就相当于数组中的下标;
    17 
    18 public:
    19     StaticStack()    // O(1)
    20     {
    21         m_top = -1;  // 当前栈中一个没有栈顶,因为一个数据也没有
    22         m_size = 0;  // 当前栈中一个数据也没有
    23    }
    24 
    25     int capacity() const    // O(1),当前栈的最大存储量
    26     {
    27         return N;
    28    }
    29 
    30     void push(const T& e)    // O(1)
    31     {
    32         if( m_size < N )
    33         {
    34             m_space[m_top + 1] = e;   // 异常安全,因为 e 可能为类,而其重载“=”可能发生异常,要保证栈的状态安全;
    35             m_top++;
    36             m_size++;
    37         }
    38         else
    39         {
    40             THROW_EXCEPTION(InvalidOperationException, "No enough space to push StaticStack ...");
    41         }
    42    }
    43 
    44     void pop()   // O(1)
    45     {
    46         if( m_size > 0 )
    47         {
    48             m_top--;
    49             m_size--;
    50         }
    51         else
    52         {
    53             THROW_EXCEPTION(InvalidOperationException, "No element to pop StaticStack ...");
    54         }
    55    }
    56 
    57     T top() const   // 获得当前的栈顶元素数据值 O(1)
    58     {
    59         if( m_size > 0 )
    60         {
    61             return m_space[m_top];   // 直接返回当前栈顶的元素
    62         }
    63         else
    64         {
    65             THROW_EXCEPTION(InvalidOperationException, "No element in current Stcak ...");
    66         }
    67     }
    68     void clear()  // O(1)
    69     {
    70         m_top = -1;
    71         m_size = 0;
    72     }
    73     int size() const   // O(1)
    74     {
    75         return m_size;
    76     }
    77 };
    78 
    79 }
    80 
    81 #endif // STATICSTACK_H

    8,StaticStack 的测试代码:

     1 #include <iostream>
     2 #include "StaticStack.h"
     3 
     4 using namespace std;
     5 using namespace DTLib;
     6 
     7 int main()
     8 {
     9    StaticStack<int, 10> stack;
    10 
    11     try
    12     {
    13         stack.pop();
    14     }
    15     catch(const Exception& e)
    16     {
    17         cout << e.message() << endl;
    18         cout << e.location() << endl;
    19    }
    20 
    21     for(int i=0; i<10; i++)
    22     {
    23         stack.push(i);
    24    }
    25 
    26     while(stack.size() > 0)
    27     {
    28         cout << stack.top() << endl;
    29         stack.pop();
    30    }
    31 
    32     return 0;
    33 }

    9,小结:

           1,栈是一种特殊的线性表;

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

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

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

  • 相关阅读:
    正则判断是否为纯数值
    前后端加密解密crypto.js
    小程序使用iconfont字体图标
    LeetCode-Combination Sum II
    LeetCode-Combination Sum
    Google 2013 campus test-R1
    Google Codejam
    LeetCode-Count and Say
    LeetCode-Binary Tree Level Order Traversal II
    LeetCode-Binary Tree Level Order Traversal
  • 原文地址:https://www.cnblogs.com/dishengAndziyu/p/10922918.html
Copyright © 2020-2023  润新知