第三十五课 栈的概念及实现(下)
Posted wanmeishenghuo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三十五课 栈的概念及实现(下)相关的知识,希望对你有一定的参考价值。
自定义Test类,给出如下的测试程序:
1 #include <iostream> 2 #include "StaticStack.h" 3 4 using namespace std; 5 using namespace DTLib; 6 7 class Test : public Object 8 { 9 public: 10 Test() 11 { 12 cout << "Test()" << endl; 13 } 14 15 ~Test() 16 { 17 cout << "~Test()" << endl; 18 } 19 }; 20 21 int main() 22 { 23 StaticStack<Test, 10> stack; 24 25 cout << stack.size() << endl; 26 27 return 0; 28 }
运行结果如下:
此时栈中没有任何元素,却调用了10次构造函数和10次析构函数。
这是因为我们使用了原生数组作为存储空间,在创建栈的时候,当然会调用泛指类型T的构造函数。
我们需要另一种存储形式,来避免这种缺陷。
添加LinkStack.h文件:
1 #ifndef LINKSTACK_H 2 #define LINKSTACK_H 3 4 #include "Stack.h" 5 #include "LinkList.h" 6 7 8 namespace DTLib 9 { 10 11 template < typename T > 12 class LinkStack : public Stack<T> 13 { 14 protected: 15 LinkList<T> m_list; 16 public: 17 void push(const T& e) 18 { 19 m_list.insert(0, e); 20 } 21 22 void pop() 23 { 24 if( m_list.length() > 0 ) 25 { 26 m_list.remove(0); 27 } 28 else 29 { 30 THROW_EXCEPTION(InvalidOperationException, "No element in current stack..."); 31 } 32 } 33 34 T top() const 35 { 36 if( m_list.length() > 0 ) 37 { 38 return m_list.get(0); 39 } 40 else 41 { 42 THROW_EXCEPTION(InvalidOperationException, "No element in current stack..."); 43 } 44 } 45 46 void clear() 47 { 48 m_list.clear(); 49 } 50 51 int size() const 52 { 53 return m_list.length(); 54 } 55 56 }; 57 58 } 59 60 #endif // LINKSTACK_H
测试程序如下:
1 #include <iostream> 2 #include "LinkStack.h" 3 4 using namespace std; 5 using namespace DTLib; 6 7 class Test : public Object 8 { 9 public: 10 Test() 11 { 12 cout << "Test()" << endl; 13 } 14 15 ~Test() 16 { 17 cout << "~Test()" << endl; 18 } 19 }; 20 21 int main() 22 { 23 LinkStack<Test> stack; 24 25 cout << stack.size() << endl; 26 27 return 0; 28 }
结果如下:
没有再调用构造函数。
以上是关于第三十五课 栈的概念及实现(下)的主要内容,如果未能解决你的问题,请参考以下文章