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

自定义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 }

结果如下:

没有再调用构造函数。

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9657085.html

时间: 2024-10-02 02:24:47

第三十五课 栈的概念及实现(下)的相关文章

第三十四课 栈的概念及实现(上)

这种使用原生数组作为存储容器的栈也简称顺序栈. 添加Stack.h文件: 1 #ifndef STACK_H 2 #define STACK_H 3 4 #include "Object.h" 5 6 namespace DTLib 7 { 8 9 template < typename T > 10 class Stack : public Object 11 { 12 public: 13 virtual void push(const T& e) = 0; 1

NeHe OpenGL教程 第三十五课:播放AVI

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十五课:播放AVI 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错.你可以试试. 首先我得说我非常喜欢这一章节.Jonat

JAVA学习第三十五课(常用对象API)- 集合框架(三)—Vector、LinkedList、ArrayList集合演示

集合框架构成图 摘自百度图片 一.Vector集合 演示 虽然Vector已经不常用了,但是还是要了解一下其中的方法 import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Vector

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

本节课内容: 1.     TaskScheduler工作原理 2.     TaskScheduler源码 一.TaskScheduler工作原理 总体调度图: 通过前几节课的讲解,RDD和DAGScheduler以及Worker都已有深入的讲解,这节课我们主要讲解TaskScheduler的运行原理. 回顾: DAGScheduler面向整个Job划分多个Stage,划分是从后往前的回溯过程:运行时从前往后运行的.每个Stage中有很多任务Task,Task是可以并行执行的.它们的执行逻辑完

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

一.QAction的信号 1.QAction被点击之后会产生一个triggered信号 (1).通过信号与槽的机制能够捕捉对QAction对象的操作 (2).项目中可以将多个信号映射到同一个槽函数 二.文件的打开.保存.另存为操作 1.文件的打开操作 2.文件的保存操作 (1).定义成员变量用于标记数据来源 3.文件的另存为操作 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMenuBar> #include <QMenu>

python第三十二课——栈

栈:满足特点 --> 先进后出,类似于我们生活中的子弹夹 [注意] 对于栈结构而言:python中没有为其封装特定的函数,我们可以使用list(列表)来模拟栈的特点 使用list对象来模拟栈结构存取数据的特点:先进后出 # 定义一个列表对象,stack(变量名.引用名) stack=[] # 向栈中添加数据(模拟压栈) stack.append('A') print(stack) stack.append('B') print(stack) stack.append('C') print(sta

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

代码 agg::rendering_buffer &rbuf = rbuf_window(); agg::pixfmt_bgr24 pixf(rbuf); typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type; renderer_base_type renb(pixf); typedef agg::renderer_scanline_bin_solid<renderer_base_type> ren

“全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第三十五章:如何获取线程被等待的时间? 下一章 "全栈2019"Java多线程第三十六章:如何设置线程的等待截止时间 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&qu

Python进阶(三十五)-Fiddler命令行和HTTP断点调试

Python进阶(三十五)-Fiddler命令行和HTTP断点调试 一. Fiddler内置命令 ??上一节(使用Fiddler进行抓包分析)中,介绍到,在web session(与我们通常所说的session不是同一个概念,这里的每条HTTP请求都称为一个session).界面中能够看到Fiddler抓取的全部HTTP请求.而为了更加方便的管理全部的session, Fiddler提供了一系列内置的函数用于筛选和操作这些session(习惯命令行操作Linux的童鞋应该能够感受到这会有多么方便