采用链式存储的栈成为链式栈(或简称链栈), 链栈的优点是便于多个栈共享存储空间和提高其效率, 且不存在栈满上溢的情况(因为链栈是靠指针链接到一起,只要内存够大, 则链栈理论上可以存储的元素是没有上限的);

与顺序栈相比, 由于顺序栈是采用的数组实现, 因此一旦数组填满, 则必须重新申请内存, 并将所有元素”搬家”, 而链栈则省略了这一”耗时耗力”的工作, 但却需要付出附加一个指针的代价;

链栈通常采用单链表实现, 并规定所有的操作都必须实在单链表的表头进行, 而且w我们的链栈没有头结点, m_top直接指向栈顶元素;

链式栈的图示如下:

链栈节点构造:

template <typename Type>
class ChainNode
{template <typename T>friend ostream &operator<<(ostream &os, const LinkStack<T> &stack);friend class LinkStack<Type>;
private:ChainNode(const Type &_data, ChainNode *_next = NULL):data(_data), next(_next) {}Type data;ChainNode *next;
};

链栈设计:

template <typename Type>
class LinkStack
{template <typename T>friend ostream &operator<<(ostream &os, const LinkStack<T> &stack);
public:LinkStack(): m_top(NULL) {}~LinkStack(){makeEmpty();}bool isEmpty() const{return m_top == NULL;}void pop() throw(std::out_of_range);const Type &top() const throw(std::out_of_range);void push(const Type &data);void makeEmpty();private:ChainNode<Type> *m_top;
};

栈的三大操作:

template <typename Type>
const Type &LinkStack<Type>::top() const
throw (std::out_of_range)
{if (isEmpty())throw std::out_of_range("stack is empty, can`t get data");return m_top->data;
}
template <typename Type>
void LinkStack<Type>::pop()
throw (std::out_of_range)
{if (isEmpty())throw std::out_of_range("stack is empty, can`t delete");ChainNode<Type> *deleteNode = m_top;m_top = m_top->next;delete deleteNode;
}
template <typename Type>
void LinkStack<Type>::push(const Type &data)
{//此处是整个链栈的关键点// 该操作会生成一个节点,// 并自动将m_top上移一格,// 而且将m_top原先指向的节点, 作为新生成的节点的下一节点//注意此处//如果第一次运行push, 则原m_top为NULL// 新m_top指向第一个元素m_top = new ChainNode<Type>(data, m_top);
}

清空整个栈:

template <typename Type>
void LinkStack<Type>::makeEmpty()
{while (!isEmpty()){pop();}
}

输出栈内所有内容:

template <typename Type>
ostream &operator<<(ostream &os, const LinkStack<Type> &stack)
{ChainNode<Type> *currentNode = stack.m_top;while (currentNode != NULL){cout << currentNode->data << ' ';currentNode = currentNode->next;}return os;
}

测试代码:

int main()
{LinkStack<int> test;for (int i = 0; i < 10; ++i){test.push(rand()%100);}cout << test << endl;cout << "top = " << test.top() << endl;test.pop();cout << "top = " << test.top() << endl;test.push(1);cout << "top = " << test.top() << endl;while (!test.isEmpty()){test.pop();}cout << test << endl;test.push(11);test.push(22);test.push(33);cout << test << endl;test.makeEmpty();try{cout << "top = " << test.top() << endl;}catch (const std::exception &e){cerr << e.what() << endl;}return 0;
}

数据结构基础(13) --链式栈的设计与实现相关推荐

  1. 数据结构基础(17) --二叉查找树的设计与实现

    二叉排序树的特征 二叉排序树或者是一棵空树,或者是具有如下特性的二叉树: 1.每一元素都有一个键值, 而且不允许重复; 2.若它的左子树不空,则左子树上所有结点的值均小于根结点的值: 3.若它的右子树 ...

  2. 数据结构基础(11) --循环链表的设计与实现

    循环链表:最后一个结点的指针域的指针又指回第一个结点的链表; 循环单链表与单链表的区别在于:表中最有一个节点的指针不再是NULL, 而改为指向头结点(因此要对我们原来的MyList稍作修改), 从而整 ...

  3. 数据结构 :: 顺序栈与链式栈的设计与实现

    数据结构 :: 双链表的设计与实现 说明:本文属于读书笔记.笔者将以讲述的方式表达全片文章.故文中提到的某些字词是非正式术语,只是笔者本人的理解性词语. 前言:本文将对顺序栈与链式栈进行设计与实现!其 ...

  4. 作业1 OO基础1-3、 设计一个教师类Teacher(属于cn.net.sdkd包)

    作业1 OO基础1-3. 设计一个教师类Teacher(属于cn.net.sdkd包) 要求: 1)属性有编号(int no).姓名(String name).年龄(int age).所属学院(Str ...

  5. 《数据结构与算法分析》课程设计——迷宫问题

    中国矿业大学信控学院   补一下我之前在博客园发布的内容  懒得调了,想复制完整代码直接复制最下面的,想复制分布代码去看我博客园链接吧 <数据结构与算法分析>课程设计--迷宫问题 - 刷子 ...

  6. 【数据结构基础】线性数据结构——栈和队列的总结及封装(C和java)

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  7. C语言数据结构-第一讲-数据结构基础概念-电大

    第一讲数据结构基础概念内容简介 数据是表征客观事物的可记录可识别的符号集合.数据是信息处理的核心基础. 本讲主要介绍了与数据结构有关的基本概念术语: l       数据 l       数据元素 l ...

  8. 学习笔记---程序员练级攻略(入门篇、修养篇、专业基础篇、软件设计篇、高手成长篇)

    根据极客时间 左耳朵耗子 整理,请忽略每一行最后的数字 文章目录 1. 入门篇 47 2. 修养篇 51 3. 专业基础篇 56 4. 软件设计篇 60 5. 高手养成 63 1. 入门篇 47 1. ...

  9. 求单链表的最大值与原地逆转_数据结构基础复习09.ppt

    数据结构基础复习09.ppt 数据结构考研辅导 基础复习 浙江大学计算机学院 内容提纲 考研概述 考察目标理解数据结构的基本概念 掌握数据结构的逻辑结构 存储结构及其差异 以及各种基本操作的实现 在掌 ...

最新文章

  1. 理解 async/await 的执行
  2. 【ds】HDU_1166
  3. 四十、Linux和ViM的使用
  4. 多图上传 - Web Uploader
  5. win7 php 上传文件,在LNMP原来的基础上,win7环境下如何上传PHP文件到Linux环境下...
  6. python安装caffe_Linux下caffe的安装
  7. 数据产品经理的5大阶段和6步作战模型
  8. python设计模式15-解释器模式
  9. 中国卡曼涡气流传感器行业市场供需与战略研究报告
  10. oncreate 测量尺寸
  11. 工频变压器和高频变压器
  12. 数字金额转换为大写金额python_python 实现金额数字转成大写
  13. IDEA统计自己写了多少行Java代码,看看自己的辛劳成果吧
  14. 层次聚类sklearn.cluster包AgglomerativeClustering
  15. android模拟器如何正确安装HAXM加速器
  16. 数据预处理利器 Amazon Glue DataBrew
  17. 【机器学习】【线性代数】正交基、标准正交基、正交矩阵,正交变换等数学知识点
  18. 了最新最全的网站收录地址搜索引擎网址提交及站长工具
  19. 黑防VIP会员工具包
  20. 200人融资3亿元,重新定义移动安全市场,这家公司是谁?

热门文章

  1. squid的简单介绍
  2. LeetCode 215 数组中的第K个最大元素
  3. 宝塔面板数据库未授权访问(端口:888)
  4. C#判断指定文件是否存在
  5. Python之eval函数实例解释
  6. Nmap个人实战总结
  7. netcat、ncc工具使用
  8. 自动化部署之jenkins及简介
  9. R6饮料AK赛(NOIP模拟赛)/省选专练HDU 5713 K个联通块
  10. thuinkphp5 input('post.arr1')接收数组出现:variable type error:array