1、思路讲解

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

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

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

2、涉及解说

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

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

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

 #include<iostream>
#include<string>
using namespace std; template<typename T>
void mySwap(T &a,T &b)
{
T temp;
temp = a;
a = b;
b = temp;
} int main()
{
//prepare parameter
int a1=,b1=;
string a2="Christal",b2="Carl";
//swap two int parameter
cout<<"a1= "<<a1<<" b1= "<<b1<<endl;
mySwap<int>(a1,b1);
cout<<"a1= "<<a1<<" b1= "<<b1<<endl;
//swap two string parameter
cout<<endl<<"a2= "<<a2<<" b2= "<<b2<<endl;
mySwap<string>(a2,b2);
cout<<"a2= "<<a2<<" b2= "<<b2<<endl; return ;
}

  输出结果:

(2)用法:

 template<class 模板参数表>
class 类名
{
//类定义
};
int main()
{
类名<参数类型> 对象名;
}

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

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

(3)类模板的实例化

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

 template<class type,int width>
class Hey
{
private:
type str;
int maxwidth;
public:
Hey():maxwidth(width){}
};

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

1 Hey<string,> say1;

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

1 Hey<char,> say2;

3、思路实现

 #include<iostream>
#include<string>
using namespace std; template<class T,int my_size> //T:type , my_size:size
class myStack
{
private:
int top; //top pointer
T items[my_size]; //stack array
const int max_size; //array size
public:
myStack():max_size(my_size),top(-){}
bool isempty();
bool isfull();
void push(const T temp);
T pop();
};
template<class T,int my_size>
bool myStack<T,my_size>::isempty()
{
if(top == -)
return true;
else
return false;
}
template<class T,int my_size>
bool myStack<T,my_size>::isfull()
{
if(top == max_size-)
return true;
else
return false;
}
template<class T,int my_size>
void myStack<T,my_size>::push(const T temp)
{
if(!isfull())
{
items[++top] = temp;
}
}
template<class T,int my_size>
T myStack<T,my_size>::pop()
{
if(!isempty())
{
return items[top--];
}
} int main()
{
//prepare parameter
int i=;
string x;
string temp[] = {"Christal","Carl","Jerry","Belle","Sea","vinky","Rita","Nila"};
//initialize stack
myStack<string,> s;
//push someone
while(!s.isfull())
{
s.push(temp[i]);
cout<<"push one person"<<endl;
i++;
}
cout<<endl<<"stack is full"<<endl<<endl;
//pop someone
while(!s.isempty())
{
x = s.pop();
cout<<x<<" is pop"<<endl;
}
cout<<endl<<"stack is empty"<<endl; return ;
}

  输出检验:

实现一个栈类,类似STL中的栈的更多相关文章

  1. <软件架构与设计模式>侯捷老师关于Adapter类在STL中的深入解析和模式探讨

    题外话:侯捷老师难得一年就来上九堂课就要会宝岛,特此留念签名赠语及合照以自勉.  学海无涯,为勤是岸 <正文开始> 昨天晚上连上了3个小时的大课探究单单讲了Adapter一个类,幸运的是本 ...

  2. STL之stack栈

    栈(statck)这种数据结构在计算机中是相当出名的.栈中的数据是先进后出的(First In Last Out, FILO).栈只有一个出口,允许新增元素(只能在栈顶上增加).移出元素(只能移出栈顶 ...

  3. STL中的stack(堆栈)

    转载:http://blog.csdn.net/morewindows/article/details/6950881 栈(statck)这种数据结构在计算机中是相当出名的.栈中的数据是先进后出的(F ...

  4. STL中一些函数的应用

    1.nth_element():找到第几大的数.用法:nth_element(a,a+k,a+n),返回一个数组a中第k大的数,时间复杂度比较小,头文件#include <algorithm&g ...

  5. Java中的栈,堆,方法区和常量池

    要说Java中的栈,堆,方法区和常量池就要提到HotSpot,HotSpot是Sun JDK 和 Open JDK中所带的虚拟机. (Sun JDK 和 Open JDK除了注释不同,代码实现基本上是 ...

  6. C++中如何设计一个类只能在堆或者栈上创建对象,面试题

    设计一个类,该类只能在堆上创建对象 将类的构造函数私有,拷贝构造声明成私有.防止别人调用拷贝在栈上生成对象. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建 注意 在堆和栈上创建对象都会调 ...

  7. 怎样从一个DLL中导出一个C++类

    原文作者:Alex Blekhman    翻译:朱金灿 原文来源: http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx 译 ...

  8. 智能指针类模板(上)——STL中的智能指针

    智能指针类模板智能指针本质上就是一个对象,它可以像原生指针那样来使用. 智能指针的意义-现代C++开发库中最重要的类模板之一-C++中自动内存管理的主要手段-能够在很大程度上避开内存相关的问题 1.内 ...

  9. 一个java源文件中为什么只能有一个public类。

    我们都遇到过一个源文件中有多个java类,但当第一个类使用public修饰时,如果下面还有类使用public修饰,会报错.也就是是说一个java源文件最多只能有一个public类. 当有一个publi ...

随机推荐

  1. 在.Net下使用redis基于StackExchange.Redis

    研究了下redis在.net下的使用,因为以前在java上用redis用的是jedis操作,在.net不是很熟悉,在网站上也看了一部分的.net下redis的使用,大部分都是ServiceStack. ...

  2. Redis 小白指南(四)- 数据的持久化保存(草稿)

    Redis 小白指南(四)- 数据的持久化保存 简介 因为 redis 将数据保存在内存中,很容易诱发的一个问题就是,程序崩溃或服务器重启等情况如何保证数据的正常存储. 当我们以 redis 作为主数 ...

  3. Spring 依赖注入之从不会到稍微会一点儿

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  4. js脚本都可以放在哪些地方

    js脚本应该放在页面的什么地方 1.head部分 包含函数的脚本位于文档的 head 部分.这样我们就可以确保在调用函数前,脚本已经载入了. 2.body部分 执行位于 body 部分的脚本. 3.外 ...

  5. python+selenium遇到鼠标悬停不成功可以使用js进行操作

    问题:在定位这种悬停后出现下拉操作的时候,尝试了使用move_to_element的方法 # ele_logout = br.find_element_by_xpath('/html/body/div ...

  6. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  7. 一道C语言安全编码题目

    1.前言 最近在网上看到一道C语言题目,用C语言实现一个函数,给定一个int类型的整数,函数输出逆序的整数,例如输入123,则输出字符串"321",,输入-123,则输出字符串&q ...

  8. 使用Azure Policy(策略)强制实现资源Tag的坑

    Azure的Tag(标记)可以帮助运维人员对云资源分类从而方便地进行计费和资源管理.然而在具体实践中工程师部署云资源的时候常常会忘记给资源做标记打Tag. 针对这个问题,Azure的官方文档建议是可以 ...

  9. h5之scrollIntoView控制页面元素滚动

    如果滚动页面也是DOM没有解决的一个问题.为了解决这个问题,浏览器实现了一下方法,以方便开发人员如何更好的控制页面的滚动.在各种专有方法中,HTML5选择了scrollIntoView()作为标准方法 ...

  10. PHP设计模式:简单工厂

    示例代码详见https://github.com/52fhy/design_patterns 简单工厂 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例. 也就是使用的 ...