栈(stack),是一种线性存储结构,它有以下几个特点:
  (01) 栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的。
  (02) 向栈中添加/删除数据时,只能从栈顶进行操作。

栈通常包括的三种操作:push、peek、pop。
  push -- 向栈中添加元素。
  peek -- 返回栈顶元素。
  pop  -- 返回并删除栈顶元素的操作

C++的STL中本身就包含了stack类,基本上该stack类就能满足我们的需求,所以很少需要我们自己来实现。本部分介绍2种C++实现。
1. C++实现一:数组实现的栈,能存储任意类型的数据。
2. C++实现二:C++的 STL 中自带的"栈"(stack)的示例。

1. C++实现一:数组实现的栈,能存储任意类型的数据

实现代码:.h

#ifndef ARRAY_STACK_HXX
#define ARRAY_STACK_HXX #include <iostream>
#include "ArrayStack.h"
using namespace std; template<class T> class ArrayStack{
public:
ArrayStack();
~ArrayStack(); void push(T t);
T peek();
T pop();
int size();
int isEmpty();
private:
T *arr;
int count;
}; // 创建“栈”,默认大小是12
template<class T>
ArrayStack<T>::ArrayStack()
{
arr = new T[];
if (!arr)
{
cout<<"arr malloc error!"<<endl;
}
} // 销毁“栈”
template<class T>
ArrayStack<T>::~ArrayStack()
{
if (arr)
{
delete[] arr;
arr = NULL;
}
} // 将val添加到栈中
template<class T>
void ArrayStack<T>::push(T t)
{
//arr[count++] = val;
arr[count++] = t;
} // 返回“栈顶元素值”
template<class T>
T ArrayStack<T>::peek()
{
return arr[count-];
} // 返回“栈顶元素值”,并删除“栈顶元素”
template<class T>
T ArrayStack<T>::pop()
{
int ret = arr[count-];
count--;
return ret;
} // 返回“栈”的大小
template<class T>
int ArrayStack<T>::size()
{
return count;
} // 返回“栈”是否为空
template<class T>
int ArrayStack<T>::isEmpty()
{
return size()==;
} #endif

测试代码:.cpp

#include <iostream>
#include "ArrayStack.h"
using namespace std; int main()
{
int tmp=;
ArrayStack<int> *astack = new ArrayStack<int>(); cout<<"main"<<endl; // 将10, 20, 30 依次推入栈中
astack->push();
astack->push();
astack->push(); // 将“栈顶元素”赋值给tmp,并删除“栈顶元素”
tmp = astack->pop();
cout<<"tmp="<<tmp<<endl; // 只将“栈顶”赋值给tmp,不删除该元素.
tmp = astack->peek(); astack->push(); while (!astack->isEmpty())
{
tmp = astack->pop();
cout<<tmp<<endl;
} return ;
}

结果说明:关于"栈的声明和实现都在头文件中"的原因,是因为栈的实现利用了C++模板,而"C++编译器不能支持对模板的分离式编译"。这在"数据结构和算法01之 线性表"中已经介绍过了。  程序的实现和逻辑都非常简单。需要说明的是,采用C++模板实现的;但是,默认数组的大小只有12,而且该实现不支持动态扩展。

2. C++实现二:C++的 STL 中自带的"栈"(stack)的示例

实现代码:

#include <iostream>
#include <stack>
using namespace std; /**
* C++ 语言: STL 自带的“栈”(stack)的示例。
*
* @author skywang
* @date 2013/11/07
*/
int main ()
{
int tmp=;
stack<int> istack; // 将10, 20, 30 依次推入栈中
istack.push();
istack.push();
istack.push(); // 将“栈顶元素”赋值给tmp,并删除“栈顶元素”
istack.pop(); // 只将“栈顶”赋值给tmp,不删除该元素.
tmp = istack.top(); istack.push(); while (!istack.empty())
{
tmp = istack.top();
istack.pop();
cout<<tmp<<endl;
} return ;
}

本文来自http://www.cnblogs.com/skywang12345/p/3562239.html

栈的实现——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. win7系统administrator用户提示没有管理员权限,造装驱动安装错误,软件无法使用

    警告1909.无法创建快捷方式 最近使用windows 7 32位安装软件,好多都失败.出现以上类似错误. 解决方法:在系统盘(C:)右键属性“安全”选项卡--“编辑”,添加“Everyone”设置为 ...

  2. linux下的xampp安装

    最近因为要部署一个php的公众号应用到一台linux的测试服务器,在考虑是用xampp这样的集成环境还是自己配置.故两个都安装配置下. 最后经过研究查阅相关资料后,总结: 因为xampp本身很开放,几 ...

  3. web服务器部署过程记录

    由于之前没有服务器部署经验,又选择了所有软件都是单独编译安装,遇到很多问题,解决之后还是学习到了很多新东西. 如今回过头来还是选择lnmp集成环境的部署方式比较方便快捷:https://lnmp.or ...

  4. _GET_

    _GET_:读取属性,没有自动创建

  5. Java数据结构和算法(一)线性结构之单链表

    Java数据结构和算法(一)线性结构之单链表 prev current next -------------- -------------- -------------- | value | next ...

  6. 13 Maven 编写插件

    Maven 编写插件 Maven 的任何行为都是由插件完成的,包括项目的清理.绵编译.测试以及打包等操作都有其对应的 Maven 插件.每个插件拥有一个或者多个目标,用户可以直接从命令行运行这些插件目 ...

  7. 淘宝星星的思路c#

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  8. Quartz教程三:Job与JobDetail介绍

    Quartz教程三:Job与JobDetail介绍 原文链接 | 译文链接 | 翻译:nkcoder | 校对: 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感 ...

  9. 软工1816 · 作业(八)项目UML设计

    团队信息 队员姓名与学号 学号 姓名 博客链接 124 王彬(组长) 点击这里 206 赵畅 点击这里 215 胡展瑞 点击这里 320 李恒达 点击这里 131 佘岳昕 点击这里 431 王源 点击 ...

  10. hdu-1140(求距离,精度判断)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1140 思路:卫星只能消灭地面上一部分的风暴,即风暴与卫星的距离最大是卫星到地球的切线的距离,大于这个距 ...