实现一个栈类,类似STL中的栈

1、思路讲解

stack集合类是一个简单的堆栈的实现。

这里有两个模板参数,T和size,T用于指定堆栈中的元素类型,my_size用于表示堆栈中项数的最大值。

类中添加方法isempty、isfull、push、pop。

2、涉及解说

  对于很久没用C++写代码的我,对于模板类很陌生了,所以首先简单介绍下模板类。

(1)用途:有那么一部分类,用途和方法是一样的,只是涉及的一些参数不同(如参数类型),这个时候引入了类模板来解决这个问题;有了类模板,我们在声明类的时候对于参数的不确定,我们先不给于具体的绑定,等到实例化的时候再指明具体的性质。

  例如函数模板的swap函数,有的想实现int型的两个变量值交换,有的想实现两个string型变量值的交换;有了函数模板,我们只需要写一个函数就可以解决不同需求:

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 template<typename T>
 6 void mySwap(T &a,T &b)
 7 {
 8     T temp;
 9     temp = a;
10     a = b;
11     b = temp;
12 }
13 
14 int main()
15 {
16     //prepare parameter
17     int a1=3,b1=4;
18     string a2="Christal",b2="Carl";
19     //swap two int parameter
20     cout<<"a1= "<<a1<<" b1= "<<b1<<endl;
21     mySwap<int>(a1,b1);
22     cout<<"a1= "<<a1<<" b1= "<<b1<<endl;
23     //swap two string parameter
24     cout<<endl<<"a2= "<<a2<<" b2= "<<b2<<endl;
25     mySwap<string>(a2,b2);
26     cout<<"a2= "<<a2<<" b2= "<<b2<<endl;
27 
28     return 0;
29 }

  输出结果:

(2)用法:

1 template<class 模板参数表>
2 class 类名
3 {
4     //类定义
5 };
6 int main()
7 {
8     类名<参数类型> 对象名;
9 }

  其中,template是类模板声明的关键字;模板参数可以只有一个,也可以有多个;参数可以是类型参数也可以是非类型参数;类型参数用关键字class或typename;非类型参数由一个普通参数构成,代表模板定义中的一个常量。

 1 template<class type,int width> class Hey;
 2 //type为类型参数,width为非类型参数

(3)类模板的实例化

  type、width是形参,同类型的实参值被提供给形参;指定的每个不同类型的值都创建一个新类。

1 template<class type,int width>
2 class Hey
3 {
4 private:
5     type str;
6     int maxwidth;
7 public:
8     Hey():maxwidth(width){}
9 };

  type被指定为string,width被指定为10,创建一个类;

1 Hey<string,10> say1;

  type被指定为char,width被指定为1,创建一个类;

1 Hey<char,1> say2;

3、思路实现

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 template<class T,int my_size> //T:type , my_size:size
 6 class myStack
 7 {
 8 private:
 9     int top; //top pointer
10     T items[my_size]; //stack array
11     const int max_size; //array size
12 public:
13     myStack():max_size(my_size),top(-1){}
14     bool isempty();
15     bool isfull();
16     void push(const T temp);
17     T pop();
18 };
19 template<class T,int my_size>
20 bool myStack<T,my_size>::isempty()
21 {
22     if(top == -1)
23         return true;
24     else
25         return false;
26 }
27 template<class T,int my_size>
28 bool myStack<T,my_size>::isfull()
29 {
30     if(top == max_size-1)
31         return true;
32     else
33         return false;
34 }
35 template<class T,int my_size>
36 void myStack<T,my_size>::push(const T temp)
37 {
38     if(!isfull())
39     {
40         items[++top] = temp;
41     }
42 }
43 template<class T,int my_size>
44 T myStack<T,my_size>::pop()
45 {
46     if(!isempty())
47     {
48         return items[top--];
49     }
50 }
51 
52 int main()
53 {
54     //prepare parameter
55     int i=0;
56     string x;
57     string temp[] = {"Christal","Carl","Jerry","Belle","Sea","vinky","Rita","Nila"};
58     //initialize stack
59     myStack<string,5> s;
60     //push someone
61     while(!s.isfull())
62     {
63         s.push(temp[i]);
64         cout<<"push one person"<<endl;
65         i++;
66     }
67     cout<<endl<<"stack is full"<<endl<<endl;
68     //pop someone
69     while(!s.isempty())
70     {
71         x = s.pop();
72         cout<<x<<" is pop"<<endl;
73     }
74     cout<<endl<<"stack is empty"<<endl;
75 
76     return 0;
77 }

  输出检验: 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿DD

Spring Boot 2.0 - WebFlux framework

1、介绍 1.1 什么是响应式编程(Reactive Programming)? 简单来说,响应式编程是针对异步和事件驱动的非阻塞应用程序,并且需要少量线程来垂...

2.2K7
来自专栏SDNLAB

Open vSwitch系列之数据结构解析深入分析ofpbuf

上一篇我们分析了hmap,hamp可以说是Open vSwitch中基石结构,很多Open vSwitch中数据结构都依赖hmap。本篇我们来分析一下ofpbu...

3448
来自专栏互联网杂技

为何webpack风靡全球?三大主流模块打包工具对比

前端的模块系统经历了长久的演变,对应的模块打包方案也几经变迁。从最初简单的文件合并,到AMD 的模块具名化并合并,再到browserify将CommonJS 模...

3438
来自专栏枕边书

用C写一个web服务器(一) 基础功能

前言 C 语言是一门很基础的语言,程序员们对它推崇备至,虽然它是我的入门语言,但大学的 C 语言知道早已经还给了老师,C 的使用可以说是从头学起。 之前一直在读...

1839
来自专栏大内老A

事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[上篇]

最近这两天一直在忙着为一个项目检查内存泄漏(Memory Leak)的问题,对相关的知识进行了一下简单的学习和探索,其间也有了一些粗浅的经验积累,今天特意写一篇...

2196
来自专栏老九学堂

2016计算机二级Java考试真题大放送,还不快收藏!

1、[单选题] 在软件开发中,需求分析阶段可以使用的工具是(  )。 A.N-S图 B.DFD图 C.PAD图 D.程序流程图 参考答案:B 参考解析:在软...

2804
来自专栏企鹅号快讯

Spring Boot 2.0-WebFlux framework

1、介绍 1.1 什么是响应式编程(Reactive Programming)? 简单来说,响应式编程是针对异步和事件驱动的非阻塞应用程序,并且需要少量线程来垂...

3705
来自专栏salesforce零基础学习

salesforce零基础学习(七十四)apex:actionRegion以及apex:actionSupport浅谈

我们在开发中,很难会遇见不提交表单的情况。常用的apex:commandButton,apex:commandLink,apex:actionFunction,...

2217
来自专栏技术博文

jQuery插件 -- Form表单插件jquery.form.js

jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地、无侵入地升级HTML表单以支持Ajax。jQuery Form有两个核心方法 -- aj...

3695
来自专栏Java Edge

SpringMVC数据绑定定义支持的数据绑定方式

定义 百度百科定义: 简单绑定是将一个用户界面元素(控件)的属性绑定到一个类型(对象)实例上的某个属性的方法。 例如,如果一个开发者有一个Customer类...

3476

扫码关注云+社区