第三十五课 栈的概念及实现(下)

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 }

 

结果如下:

技术分享图片

没有再调用构造函数。

 

以上是关于第三十五课 栈的概念及实现(下)的主要内容,如果未能解决你的问题,请参考以下文章

2018-08-22 第三十五课

AGG第三十五课 gsv_text 渲染ASCII字符

DT大数据梦工厂第三十五课 Spark系统运行循环流程

第三十五课文本编辑器中的数据存取

数据结构基础学习——栈的概念及代码实现

栈的概念及实现