标签:lib static stack 构造 alt 大小 mes message image
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 的最大容量由模板参数决定;
标签:lib static stack 构造 alt 大小 mes message image
原文地址:https://www.cnblogs.com/dishengAndziyu/p/10922918.html