模板实现简易stack

栈提供了以下操作:

/*cpp*/
s.empty()        //如果栈为空返回true,否则返回false
s.size()                 //返回栈中元素个数   
s.pop()                  //删除栈顶元素,但不返回其值
s.top()                  //返回栈顶元素,但不删除元素
s.push()                 //在栈顶压入新元素

模拟实现:

/*Stack.cpp*/

#include <iostream>
using namespace std;

template <class T>
class SeqList
{
public:
	SeqList()
		:_data(NULL)
		,_size(0)
		,_capacity(0)
	{
		CheckCapacity();
	}
	~SeqList()
	{
		if(_data != NULL)
		{
			delete[] _data;
		}
	}
public:
	void Display() const
	{
		int i = 0;
		for(i; i<_size; i++)
		{
			cout<<_data[i]<<" ";
		}
		cout<<"over"<<endl;
	}
	void CheckCapacity()
	{
		if(_size == _capacity)
		{
			T* tmp = new T[_capacity+3];
			memcpy(tmp, _data, (_capacity)*sizeof(T));
			delete[] _data;
			_data = tmp;
			_capacity = _capacity+3;
		}
	}
	void PushBack(const T& d)
	{
		CheckCapacity();
		_data[_size] = d;
		_size++;
	}
	void PopBack()
	{
		if(_size == 0)
		{
			cout<<"Stack is empty!!"<<endl;
			return;
		}
		_size--;
	}
	int GetSize()
	{
		return _size;
	}
	T& retTop() const
	{
		if(_data == NULL)
		{
			cout<<"Stack is empty!!"<<endl;
			exit(1);
		}
		return _data[_size-1];
	}
	bool retEmpty() const
	{
		if(_data == NULL)
		{
			return false;
		}
		return true;
	}
protected:
	int _size ;
	int _capacity ;
	T* _data ;
};
template <class T, class Container >
class Stack
{
public :
	void Push(const T& x)
	{
		_con.PushBack(x);
	}
	void Pop()
	{
		_con.PopBack();
	}
	int Size()
	{
		return _con.GetSize();
	}
	const T& Top()
	{
		return _con.retTop();
	}
	bool Empty()
	{
		return _con.retEmpty();
	}
	void Show()
	{
		_con.Display();
	}
private:
	Container _con;
};

int main()
{
	Stack<int, SeqList<int>> stack1;
	stack1.Push(1);
	stack1.Push(2);
	stack1.Push(3);
	stack1.Push(4);
	stack1.Push(5);
	stack1.Show();
	stack1.Pop();
	stack1.Show();
	int ret = stack1.Top();
	cout<<ret<<endl;
	bool result = stack1.Empty();
	cout<<result<<endl;
	int size = stack1.Size();
	cout<<size<<endl;
	system("pause");
	return 0;
}

结果:

时间: 2024-11-10 07:36:53

模板实现简易stack的相关文章

C++ STL标准模板库(stack)

//stack的使用 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<stack> using namespace std; /* 引用头文件 #include<stack> stack类本身是一个类模板 stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,— —也就是说实现了一个先进后出(FILO)的数据结构. 1.empty() 堆栈为空则返回真 2.pop() 移除栈顶元素

ASP.NET Core Blazor 用Inspinia静态页模板搭建简易后台(实现菜单选中)

Blazor 是一个用于使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建丰富的交互式 UI. 共享使用 .NET 编写的服务器端和客户端应用逻辑. 将 UI 呈现为 HTML 和 CSS,以支持众多浏览器,其中包括移动浏览器. 一.网站下载Inspinia 模板 建立 ASP.NET Core Blazor 项目 如果是服务器模式 把js和css核心复制进去,放置位置是很目录的 _Host.cshtml. 如果是WebAssembly 模式

woocommerce模板制作简易教程

woocommerce是wordpress里比较好用的电商解决方案,但是制作woocommerce模板相对比较复杂,如果想用woocommerce来建一个展示型的网站,不带下单功能,我们可以很快就能把模板设计出来,下面就跟着ytkah一起来学习吧 展示型网站主要用到的woocommerce函数就产品列表页和产品详情页,其余按默认模板 1.后台安装启用woocommerce插件,复制/wp-content/plugins/woocommerce/templates/下所有文件到/wp-conten

C++类模板

在上篇文章(C++函数模板)中,主要介绍了C++中函数模板,与函数相似,类也可以被一种或多种类型参数化.容器类就是一个具有这种特性的典型的例子, 本文地址:http://www.cnblogs.com/archimedes/p/cpp-class-template.html,转载请注明源地址. 以下通过设计一个类模板Stack的实现来说明: 类模板Stack的实现 #include<iostream> #include<vector> #include<stdexcept&g

JS模板引擎 :ArtTemplate (2)

上一篇初略的介绍了一下javascript中的模板引擎,有兴趣的可以戳 这里 . 这一篇将带着大家一起做一个简易的模板引擎, 上一篇介绍到:模板引擎其实做的就是两件事. 根据一定的规则,解析我们所定义的模板 根据数据以及模板生成html(其实背后也是用的字符串拼接) 那么,首先,我们要有一个模板,一份数据,以及想生成的结果. 例如:模板: 1 <script id="test" type="text/html"> 2 <p><%=tit

C++:类模板与模板类

6.3 类模板和模板类 所谓类模板,实际上是建立一个通用类,其数据成员.成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表.使用类模板定义对象时,系统会实参的类型来取代类模板中虚拟类型从而实现了不同类的功能. 定义一个类模板与定义函数模板的格式类似,必须以关键字template开始,后面是尖括号括起来的模板参数,然后是类名,其格式如下: template <typename 类型参数> class 类名{       类成员声明 }; 或者 template <class

C++学习之模板 ----函数模板、类模板

本博文主要讨论函数模板与类模板以及其简单应用. 1).作用:函数模板和类模板都可以看做是一种代码产生器,往里面放入具体的类型,得到具体化的函数或者class. 2).编译(分为两步): a):实例化之前,先检查模板本身语法是否正确: b):根据 函数调用或者类模板调用 ,先去实例化模板代码,产生具体的函数/类. 也就是说, 没有函数调用或者类类型对象声明,就不会实例化模板代码,在目标文件obj中找不到模板的痕迹. 3):优缺点 模板的缺点是代码膨胀,编译速度慢,而优点是运行速度快. 一.函数模板

模板函数和模板类的区别

函数模板与类模板的区别 答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化 必 须由程序员在程序中显式地指定. 即函数模板允许隐式调用和显式调用而类模板只能显示调用 这期间有涉及到函数模板与模板函数,类模板与模板类的概念 (类似于类与类对象的区 别) 请看下面例子 注意:模板类的函数声明和实现必须都在头文件中完成,不能像普通类那样声明在.h文件中实现在.cpp文件中,原因可以看链接http://hi.baidu.com/cn_rigel/blog/item/6cf6fc

C++学习之模板 (二) -----类模板

由于将函数和类模板放在一块篇幅较大,我们今天将其拆分为两篇博文. 上篇博文我们讨论了函数模板的简单应用,本篇我们继续讨论模板的另一板块--类模板. 1).作用:类模板类似于代码产生器,根据用户输入的类型不同,产生不同的class: 2).编译: a):检查模板class 的自身语法: b):根据用户指定的类型 如 vector<string>,去实例化一个模板类. 注意: 不是实例化所以的代码,而仅仅实例化用户调用的部分: 类模板:简单实现如下; 1 #include <iostream