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

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 的最大容量由模板参数决定;

转载于:https://www.cnblogs.com/dishengAndziyu/p/10922918.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值