#ifndef _STACK_H
#define _STACK_H
#pragma once

template< class T >
class Stack
{
public:
Stack( void ) : size( 0 ), capacity( 1 ),_( new T[ capacity ] ){} ;//构造函数 成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的

Stack( const Stack& ) ;//拷贝构造函数
~Stack( void ) ;//析构函数
Stack& operator = ( const Stack& ) ;//重载赋值运算符

int Size( void ) const ;//返回栈中元素数目
int Capacity( void ) const ;//返回当前栈的容量
bool IsEmpty( void ) const ;//判断栈是否为空栈
T& Top( void ) const ;//返回栈顶元素
void Push( const T& ) ;//将元素压入栈中,当元素数目超过栈的容量时重建栈
void Pop( void ) ;//弹出栈顶元素
protected:
int size ;//栈中元素数目
int capacity ;//栈的容量
void Expand( void ) ;//扩充栈
void Decrease( void ) ;//压缩栈
private:
T* _ ;//保存栈中元素的数组
} ;

template< class T >
Stack< T >::Stack( const Stack< T > & s ) : size( s.size ) , capacity( s.capacity ),_( new T[ capacity ] )
{
for( int i = 0 ; i < capacity ; ++i )
_[ i ] = s._[ i ] ;
}

template< class T >
Stack< T >::~Stack( void )
{
delete [ ]_ ;
}

template< class T >
Stack< T >& Stack< T >::operator = ( const Stack& s )
{
_ =new T[ s.capacity ] ;
size = s.size ;
capatity = s.capacity ;
for( int i = 0 ; i < capacity ; ++i )
_[ i ] = s._[ i ] ;
}

template< class T >
int Stack< T >::Size( void ) const
{
return size ;
}

template< class T >
int Stack< T >::Capacity( void ) const
{
return capacity ;
}

template< class T >
bool Stack< T >::IsEmpty( void ) const
{
return size == 0 ;
}

template< class T >
T& Stack< T >::Top( void ) const
{
return _[ size - 1 ] ;
}

template< class T >
void Stack< T >::Pop( void )
{
if( size == capacity / 2 ) Decrease( ) ;
--size ;
}

template< class T >
void Stack< T >::Push( const T& obj )
{
if( size == capacity ) Expand( ) ;
_[ size++ ] = obj ;
}

template< class T >
void Stack< T >::Expand( void )
{
capacity *= 2 ;//double the capacity of the storage array
T* __ = new T[ capacity ] ;
for( int i = 0 ; i < size ; ++i ) __[ i ] = _[ i ] ;
delete [ ]_ ;
_ = __ ;
}

template< class T >
void Stack< T >::Decrease( void )
{
capacity /= 2 ;//half the capacity of the storage array
T* __ = new T[ capacity ] ;
for( int i = 0 ; i < size ; ++i )
__[ i ] = _[ i ] ;
delete [ ]_ ;
_ = __ ;
}
#endif

C++ 栈的实现的更多相关文章

  1. 通往全栈工程师的捷径 —— react

    腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...

  2. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  3. duang~免费的学习视频来啦:学霸君之全栈测试

    学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...

  4. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  5. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  6. BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]

    4453: cys就是要拿英魂! Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 46[Submit][Status][Discu ...

  7. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2326  Solved: 1054[Submit][Status ...

  8. .NET全栈开发工程师学习路径

    PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...

  9. Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解

    用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...

  10. 匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置

    0x00 前言: 匹夫在日常和别人交流的时候,常常会发现一旦讨论涉及到“类型”,话题的热度就会立马升温,因为很多似是而非.或者片面的概念常常被人们当做是全面和正确的答案.加之最近在园子看到有人翻译的& ...

随机推荐

  1. java接口的理解

    接口的最主要的作用是达到统一访问,就是在创建对象的时候用接口创建,[接口名] [对象名]=new [实现接口的类],这样你像用哪个类的对象就可以new哪个对象了,不需要改原来的代码,就和你的USB接口 ...

  2. Transfer learning across two sentiment classes using deep learning

    用深度学习的跨情感分类的迁移学习 情感分析主要用于预测人们在自然语言中表达的思想和情感. 摘要部分:two types of sentiment:sentiment polarity and poli ...

  3. 12行代码 让浏览器崩溃,iPhone重启

    <html> <body> <script> var total=""; for (var i=0;i<1000000;i++) {    ...

  4. Oracle EBS-SQL (INV-1):检查物料成本为0并且物料状态不是'NEW'的物料.sql

    select --msi.inventory_item_id        --,msi.organization_id     msi.segment1                        ...

  5. jQuery学习-事件之绑定事件(四)

    今天我们来学习jQuery.Event对象.jQuery为了添加自己的处理机制,及可以传递用户自定义数据,于是Event对象就出世了.   1 jQuery.Event = function( src ...

  6. MFC 双缓冲加载背景

    首先定义DCmemDc和Bitmap CDC DCmemDc: CBitmap memBitmap; CBitmap *oldBitmap; 然后创建一个适应当前内存的DCmemDc CDC * dc ...

  7. Unity CCTween UGUI 动画插件

    在这简单的介绍一下 CCTween 动画插件的使用 因为GIF 制作软件不太好(网上随便下载的)所以导致效果不太好,有时间我重新制作一下 这是一下简单的效果 下面介绍怎么使用 首先 先下载 CCTwe ...

  8. Clojure 学习入门(19)—— 数组

    1.创建数组 1.1 从集合创建数组 into-array into-array (into-array aseq) (into-array type aseq) 演示样例: user=> (i ...

  9. android 基本控件使用

    http://tech.it168.com/a2012/0321/1327/000001327704.shtml Android_ListView_用代码控制ListView的位置 有三种方法 mli ...

  10. iOS获取本地ip(基本通用)

    今天有个朋友问我怎样訪问手机ip,上网找了几个,用了近200多行代码,最后发现头文件用的居然还是Linux中的,OC没有这个头文件.感觉socket本身应该能够后去自己的ip就试了一下,果然7.8行代 ...