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

这种使用原生数组作为存储容器的栈也简称顺序栈。

添加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;
14     virtual void pop() = 0;
15     virtual T top() const = 0;
16     virtual void clear() = 0;
17     virtual int size() const = 0;
18 };
19
20 }
21
22 #endif // STACK_H

添加StaticStack.h文件:

 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];
15     int m_top;
16     int m_size;
17 public:
18     StaticStack()
19     {
20         m_top = -1;
21         m_size = 0;
22     }
23
24     int capacity() const
25     {
26         return N;
27     }
28
29     void push(const T& e)
30     {
31         if( m_size < N )
32         {
33             m_space[m_top + 1] = e;  //先赋值,保证异常安全
34             m_top++;
35             m_size++;
36         }
37         else
38         {
39             THROW_EXCEPTION(InvalidOperationException, "No space in current stack ...");
40         }
41     }
42
43     void pop()
44     {
45         if( m_size > 0 )
46         {
47             m_top--;
48             m_size--;
49         }
50         else
51         {
52             THROW_EXCEPTION(InvalidOperationException, "No element in current stack ...");
53         }
54     }
55
56     T top() const
57     {
58         if( m_size > 0 )
59         {
60             return m_space[m_top];
61         }
62         else
63         {
64             THROW_EXCEPTION(InvalidOperationException, "No element in current stack ...");
65         }
66     }
67
68     void clear()
69     {
70         m_top = -1;
71         m_size = 0;
72     }
73
74     int size() const
75     {
76         return m_size;
77     }
78 };
79
80 }
81
82 #endif // STATICSTACK_H

测试程序如下:

 1 #include <iostream>
 2 #include "StaticStack.h"
 3
 4 using namespace std;
 5 using namespace DTLib;
 6
 7
 8 int main()
 9 {
10     StaticStack<int, 5> stack;
11
12     for(int i = 0; i < 5; i++)
13     {
14         stack.push(i);
15     }
16
17     while( stack.size() > 0 )
18     {
19         cout << stack.top() << endl;
20         stack.pop();
21     }
22
23     return 0;
24 }

运行结果如下:

小结:

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

时间: 2024-10-17 19:46:23

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

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

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

第三十四课 二维数组的存储 【项目1-3】

第三十四课 二维数组的存储 项目一[二维数组当函数参数] 定义一个函数来完成对参数数组中元素的求和工作,函数声明如下: [cpp] view plain copy print? int sum(int array[ ][4],int m,int n);  //该函数完成对array数组中的前m行和n列元素求和 在以下程序的基础上,完成对sum函数的定义. [cpp] view plain copy print? #include <stdio.h> int sum(int array[ ][4

JAVA学习第三十四课(常用对象API)- 集合框架(二)—List集合及其子类特点

整个集合框架中最常用的就是List(列表)和Set(集) 一.List集合 && Set的特点 Collection的子接口: 1.List:有序(存入和取出的顺序一致),元素都有索引且可以重复    API文档解释:有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素. 2.Set:元素不能重复,无序,有可能会有序    API文档解释:一个不包含重复元素的 coll

JAVA学习第三十四课 (经常使用对象API)—List集合及其子类特点

整个集合框架中最经常使用的就是List(列表)和Set(集) 一.List集合 && Set的特点 Collection的子接口: 1.List:有序(存入和取出的顺序一致),元素都有索引且能够反复    API文档解释:有序的 collection(也称为序列).此接口的用户能够对列表中每一个元素的插入位置进行精确地控制.用户能够依据元素的整数索引(在列表中的位置)訪问元素,并搜索列表中的元素. 2.Set:元素不能反复,无序,有可能会有序    API文档解释:一个不包括反复元素的 c

第三十四课:jQuery Deferred详解2

上一课主要分析了jQuery1.51版本的jQuery Deferred.在jQuery1.6中,jQuery Deferred添加了两个方法,always,pipe. always用来添加回调,无论成功还是失败,都会执行. pipe就是管道的意思,对回调使用瀑布模型,上一个回调的返回值供下一个会调使用. 我们举个例子来说明下pipe与then的区别: var deferred = $.Deferred();  //返回的是Deferred对象 var promise = deferred.pi

第三十四课 Spark中任务处理的Stage划分和Task最佳位置算法

本节课的内容 1.     Job Stage的划分算法 2.     Task最佳计算位置算法 一.Stage划分算法 由于Spark的算子构建一般都是链式的,这就涉及了要如何进行这些链式计算,Spark的策略是对这些算子,鲜花分Stage,然后在进行计算. 由于数据是分布式的存储在各个节点上的,所以为了减少网络传输的开销,就必须最大化的追求数据本地性,所谓的数据本地性是指,在计算时,数据本身已经在内存中或者利用已有缓存无需计算的方式获取数据. 1.      Stage划分算法思想 (1)一

python第三十二课——栈

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

AGG第三十四课 stroke_aa和outline_aa渲染线段效率对比

1 渲染代码 void TestStrokeAAPerformance() { 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_aa

python第三十四课——1.匿名函数的定义和使用

演示匿名函数的定义和使用 # 定义无参有返回值的有名函数: def func(): return True # 定义无参有返回值的匿名函数 f=lambda : True # 调用有名函数执行 print(func()) # 调用匿名函数执行 print(f()) # 定义无参无返回值的有名函数: def func(): print(True) # 定义无参无返回值的匿名函数: f=lambda : print(True) # 调用有名函数执行 func() #调用匿名函数执行 f() 需求:字