对于栈的定义,前人之述备矣。

我实现的是一个stack<value>容器类,支持push,pop,top,size,empty,clear和copy construction操作。

主要的实现思路是,先写出几个支持基本操作的类_stack_impl,然后再写一个包装类stack,包装基本操作,再实现size,copy struction,top,clear和抛出异常的功能。这样做(pImpl)的好处不言而喻。

我实现的copy structurion其实是用的一个包装了的友元函数_stack_copy(dst, src),因为这样可以直接访问底部成员并进行复制,比使用用户接口,先一个一个pop,再一个一个push,快多了。

代码使用C++11标准。如果有不对的地方,欢迎指出。

在Win7 mingw32 gcc4.7下编译并测试通过。测试内容非常简单,所以可能会有一些没测试出来的问题。

以下是实现

 #pragma once
#include <cstddef>
#include <stdexcept> namespace jt { template <class value>
class stack {
template <class v>
friend void _stack_copy(stack<v>& dst, const stack<v>& src); private:
struct _stack_impl;
_stack_impl *_impl = nullptr;
size_t _siz; void _init_empty() {
_siz = ;
if (_impl) delete _impl;
_impl = new _stack_impl;
} void _destory() { _siz = ; delete _impl; } public:
stack() { _init_empty(); }
stack(const stack<value> &o) { _stack_copy(*this, o); }
~stack() { _destory(); } void clear() { _init_empty(); }
void push(const value &val) { _impl->push(val); ++_siz; }
size_t size() const { return _siz; } value pop() {
if (_siz == )
throw std::out_of_range("jt::stack::pop() - Empty Stack");
--_siz; return _impl->pop();
} bool empty() const { return _siz == ; } value top() const {
if (_siz == )
throw std::out_of_range("jt::stack::top() - Empty Stack");
return _impl->n->val;
}
}; template <class value>
static void _stack_copy(stack<value> &dst, const stack<value> &src) {
dst._init_empty();
auto **dn = &dst._impl->n; // dest node for (auto *s = src._impl->n; s; s = s->next) {
*dn = new typename stack<value>::_stack_impl::node;
(*dn)->val = s->val;
dn = &(*dn)->next;
} dst._siz = src._siz;
} template <class value>
struct stack<value>::_stack_impl {
struct node {
value val;
node *next = nullptr;
} *n = nullptr; // head/top ~_stack_impl() {
while (n) {
auto *tmp = n->next;
delete n;
n = tmp;
}
} void push(const value &val) {
node *t = new node;
t->val = val;
t->next = n; n = t;
} value pop() {
value v = n->val; node *tmp = n->next;
delete n;
n = tmp; return v;
}
}; }

[C++][数据结构]栈(stack)的实现的更多相关文章

  1. C# 数据结构 栈 Stack

    栈和队列是非常重要的两种数据结构,栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素和元素的逻辑关系也相同 差别在于:线性表的操作不受限制,栈和队列操作受限制(遵循一定的原则),因此栈和队 ...

  2. java数据结构 栈stack

    栈(Stack) 栈(Stack)实现了一个后进先出(LIFO)的数据结构. 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部. 当你从栈中取元素的时候,就从栈顶 ...

  3. 数据结构—栈(Stack)

    栈的定义--Stack 栈是只允许在末端进行插入和删除的线性表.栈具有后进先出的特性(LIFO ,Last In Fast Out). 学过数据结构的人都知道:栈可以用两种方式来实现,一种方法是用数组 ...

  4. 模板 - 数据结构 - 栈/Stack

    普通的栈大家都会写,STL的栈据说默认实现方式是deque,没关系反正deque跑得飞快. 这里收录的是一些奇怪的栈,当然双栈实现的队列收录在队列里面. 对顶栈 众所周知,栈可以维护一系列前缀和,包括 ...

  5. 数据结构----栈stack

    栈的概念与数据结构 栈(有时称为“后进先出栈”)是一个元素的有序集合,其中添加移除新元素总发生在同一端.这一端通常称为“顶部”.与顶部对应的端称为“底部”.栈的底部很重要,因为在栈中靠近底部的元素是存 ...

  6. python基本数据结构栈stack和队列queue

    1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...

  7. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  8. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  9. java数据结构——栈(Stack)

    学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...

随机推荐

  1. bzoj4458: GTY的OJ

    题目大意:给定一棵带点权的有根树,同时给定L,R,要求找M条链,每条链满足以下条件的情况下,要求所有链权和最大: 1.两两不相同(可以包含/相交等) 2.节点数在[L,R]间 3.其中一个端点的深度必 ...

  2. 大二在CSDN的博客整理

    001我为什么想写博客 控制台版2048 version_1.0总结 022 囚徒困境中的均衡-----从一篇经典论文说起 021 模拟退火算法学习(一)-----求解最短连通路径 020 小记一次网 ...

  3. SSIS同步多个数据库

    这周接到了一个新的需求,从IBM DB2,同步数据到SQLServer.在从SQLServer,同步到Oracle. 因为IBM是32位的平台,ORACLE是64位的平台.而且要求使用计划任务,所以需 ...

  4. Linux多安全策略和动态安全策略框架演示验证方案及结果分析

    3演示验证方案及结果分析3.1演示验证方案3.1.1验证目标该方案主要用于验证采用Flask体系结构实现的SELinux对系统的防护过程及相应的防护原理.3.1.2验证环境操作系统:启用了SELinu ...

  5. 新手理解HTML、CSS、javascript之间的关系

    http://www.cnblogs.com/dreamingbaobei/p/5062901.html 工作多年,一直忙忙碌碌的应用各种技术,现在不忙了,问问自己究竟在做什么,究竟会什么竟答不上来, ...

  6. LinqPad工具:帮你快速学习Linq

    LinqPad工具:帮你快速学习Linq 参考: http://www.cnblogs.com/li-peng/p/3441729.html ★:linqPad下载地址:http://www.linq ...

  7. java 集合list遍历时删除元素

    本文探讨集合在遍历时删除其中元素的一些注意事项,代码如下 import java.util.ArrayList; import java.util.Iterator; import java.util ...

  8. 媒体查询判断ipad和iPhone各版本

    /* 判断ipad */ @media only screen and (min-device-width : 768px) and (max-device-width : 1024px){ /* s ...

  9. iOS开发

    #import 预处理指令,相对于 #include 而言,能防止重复拷贝,它可以导入OC头文件,也可以导入C头文件. OC中在一个框架中,有一个主头文件(该头文件名称一般跟框架名称相同),该主头文件 ...

  10. 公众平台关注用户达到5万即可开通流量主功能 可以推广APP应用

    今天微信公众平台发布发布了一些更新,公众帐号的关注用户达到5万,即可开通流量主功能,之前的是要求10万粉丝,这是一个微信开放的信号.广告主可推广苹果商店应用或腾讯开放平台应用.新增卡片和图文广告规格. ...