上一节用连续的方式实现栈,这种方法用一个确定大小的数组存储栈元素,因为当存储达到数组上限时会遇到麻烦。

连续实现的栈与链式实现的栈的最大不同在于,前者使用一个确定大小的数组存储每一个栈元素,后者使用带指针的自定义结构(Node)来存储栈元素,因此可以在后期持续增加栈元素。

链式栈的栈元素存储于自定义的数据结构--Node中,每一个Node均包含两个属性,一个是它里面的元素(栈元素),一个是指向它下一个Node的指针。由此,一个Node包含着栈元素,同时它指向着下一个Node,以此类推,构成一种链式实现的栈。最后,要用顶部指针(指向第一个Node的指针)作为该栈的寻址头。

另外,在这个链式栈的实现当中还实现了几个有用的成员函数--析构函数与重载赋值运算。

代码:

Node.h文件:

  1. /*
  2. * Node.h
  3. *
  4. * Created on: 2015年8月27日
  5. * Author: Lv_Lang
  6. */
  7.  
  8. #ifndef NODE_H_
  9. #define NODE_H_
  10.  
  11. #include "stdio.h"
  12.  
  13. typedef int Stack_entry;
  14. typedef Stack_entry Node_entry;
  15.  
  16. struct Node
  17. {
  18. // data members
  19. Node_entry entry; // 存放的元素
  20. Node *next; // 指向下一个元素的指针
  21. // Constructors
  22. Node();
  23. Node(Node_entry item, Node *add_on = NULL);
  24. };
  25.  
  26. #endif /* NODE_H_ */

Node.cpp文件:

  1. /*
  2. * Node.cpp
  3. *
  4. * Created on: 2015年8月27日
  5. * Author: Lv_Lang
  6. */
  7.  
  8. #include "Node.h"
  9.  
  10. Node::Node()
  11. {
  12. next = NULL;
  13. }
  14. Node::Node(Node_entry item, Node *add_on)
  15. {
  16. entry = item;
  17. next = add_on;
  18. }

Stack.h文件:

  1. /*
  2. * Stack
  3. *
  4. * Created on: 2015年8月21日
  5. * Author: Administrator
  6. */
  7.  
  8. #ifndef STACK
  9. #define STACK
  10.  
  11. #include "Node.h"
  12.  
  13. const int maxstack = 10;
  14. enum Error_code {overflow, underflow, success};
  15.  
  16. class Stack
  17. {
  18. public:
  19. Stack();
  20. bool empty()const;
  21. Error_code pop();
  22. Error_code top(Stack_entry &item)const;//察看顶部元素,item作为取出值的载体
  23. Error_code push(const Stack_entry &item);// item是放入的值
  24. // Safety features for linked structures
  25. ~Stack();
  26. Stack(const Stack &original);
  27. void operator = (const Stack &original);
  28. protected:
  29. Node *top_node;
  30. };
  31.  
  32. #endif /* STACK_ */

Stack.cpp文件:

  1. /*
  2. * Stack.cpp
  3. *
  4. * Created on: 2015年8月21日
  5. * Author: Administrator
  6. */
  7. #include "Stack.h"
  8.  
  9. Stack::Stack()
  10. {
  11. top_node = NULL;
  12. }
  13. bool Stack::empty()const
  14. {
  15. if(top_node == NULL)
  16. return true;
  17. else
  18. return false;
  19. }
  20. Error_code Stack::pop()
  21. {
  22. if(empty())
  23. return underflow;
  24. else
  25. {
  26. //只需新建一个指针,无须新建空间故不用new
  27. Node *old_top = top_node;
  28. top_node = old_top->next;
  29. delete old_top; //记得要delete掉被删除指针指向的空间
  30. return success;
  31. }
  32. }
  33. Error_code Stack::top(Stack_entry &item)const
  34. {
  35. if(empty())
  36. return underflow;
  37. else
  38. item = top_node->entry;
  39. return success;
  40. }
  41. Error_code Stack::push(const Stack_entry &item)
  42. {
  43. //需要先new出一块区域
  44. Node *new_top = new Node(item,top_node); //new语句返回的是指针
  45. if(new_top== NULL)
  46. return overflow;
  47. else
  48. {
  49. top_node = new_top;
  50. return success;
  51. }
  52. }
  53. Stack::~Stack()
  54. {
  55. while(!empty())
  56. {
  57. pop();
  58. }
  59. }
  60. void Stack::operator =(const Stack &original)
  61. {
  62. Node *new_top, *new_copy, *original_node = original.top_node;
  63. if(original.top_node == NULL)
  64. new_top = NULL;
  65. else
  66. {
  67. new_top = new_copy = new Node(original_node->entry);
  68. while(original_node->next != NULL)
  69. {
  70. original_node = original_node->next;
  71. new_copy->next = new Node(original_node->entry);
  72. new_copy = new_copy->next;
  73. }
  74. }
  75. while(!empty()) //Clean out old Stack entries
  76. pop();
  77. top_node = new_top; // and replace them with new entries
  78. }
  79. Stack::Stack(const Stack &original)
  80. {
  81. Node *new_copy, *original_node = original.top_node;
  82. if(original.top_node == NULL)
  83. top_node = NULL;
  84. else
  85. { // Duplicate(copy) the linked nodes
  86. top_node = new_copy = new Node(original_node->entry);
  87. while(original_node->next != NULL)
  88. {
  89. original_node = original_node->next;
  90. new_copy->next = new Node(original_node->entry);
  91. new_copy = new_copy->next;
  92. }
  93. }
  94. }

main函数测试文件:

  1. /*
  2. * main.cpp
  3. *
  4. * Created on: 2015年8月21日
  5. * Author: Administrator
  6. */
  7. #include "Stack.h"
  8. //using
  9.  
  10. void test_1();
  11. void test_2();
  12.  
  13. int main()
  14. {
  15. Stack mystack;
  16. bool e = mystack.empty();
  17. mystack.push(2);
  18. e = mystack.empty();
  19. mystack.push(5);
  20. int a;
  21. mystack.top(a);
  22. printf("%s %d\n","Hello",a);
  23.  
  24. Stack stack_1(mystack);
  25. int b;
  26. stack_1.top(b);
  27. printf("%s %d\n","Hello1",b);
  28.  
  29. Stack stack_2;
  30. stack_2 = mystack;
  31. int c;
  32. stack_2.top(c);
  33. printf("%s %d\n","Hello2",c);
  34.  
  35. return 0;
  36. }

main函数测试文件写的比较粗糙,这里只要测试能成功实现栈的重载赋值操作即可。

C++数据结构之Linked Stack(链式栈)的更多相关文章

  1. 数据结构11: 栈(Stack)的概念和应用及C语言实现

    栈,线性表的一种特殊的存储结构.与学习过的线性表的不同之处在于栈只能从表的固定一端对数据进行插入和删除操作,另一端是封死的. 图1 栈结构示意图 由于栈只有一边开口存取数据,称开口的那一端为“栈顶”, ...

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

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

  3. [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)

    再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...

  4. 数据结构学习笔记——stack实现(数组篇)

    一 栈:是一种表,限制插入和删除只能在一个位置,也即是表的末端(也是栈的顶)进行. 基本操作:push 和 pop. 二 栈的数组实现: 运用数组来存储元素,和栈操作先关的是theArray(一个数组 ...

  5. Python数据结构应用1——Stack

    Reference: Problem Solving with Algorithms and Data Structures, Release 3.0 自学一下数据结构,学完之后刷leetcode,使 ...

  6. 算法与数据结构基础 - 堆栈(Stack)

    堆栈基础 堆栈(stack)具有“后进先出”的特性,利用这个特性我们可以用堆栈来解决这样一类问题:后续的输入会影响到前面的阶段性结果.线性地遍历输入并用stack处理,这类问题较简单,求解时间复杂度一 ...

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

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

  8. 数据结构 -- 栈(Stack)

    一.栈的简介 定义 栈(英语:stack)又称为堆栈或堆叠,栈作为一种数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据 ...

  9. 第二十三篇 玩转数据结构——栈(Stack)

          1.. 栈的特点: 栈也是一种线性结构: 相比数组,栈所对应的操作是数组的子集: 栈只能从一端添加元素,也只能从这一端取出元素,这一端通常称之为"栈顶": 向栈中添加元 ...

随机推荐

  1. 实现 像网易云音乐 播放列表那样的弹出型Dialog

    如图 所示是点击Test之后的 弹出的Dialog (请无视我工程的命名) 20161017/**加入点击回调,假设dialog里放了一个TextView*/ 得先写一个点击回调 public int ...

  2. linux笔记:linux常用命令-帮助命令

    帮助命令:man(获得帮助信息) 帮助命令:help(获得shell内置命令的帮助信息)

  3. DI 之 3.1 DI的配置使用(肆)

    3.1.1  依赖和依赖注入 传统应用程序设计中所说的依赖一般指"类之间的关系",那先让我们复习一下类之间的关系: 泛化:表示类与类之间的继承关系.接口与接口之间的继承关系: 实现 ...

  4. 纯css3代码写下拉菜单效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 通过VBA实现checkbox的全选和反选

    checkbox的全选和反选可以通过VBA来控制,这种设计常见于一些交互式报表,代码如下: 1.分成两个IF判断 Private Sub CheckBox1_Click()  ‘checkbox为总控 ...

  6. Compound Interest Calculator2.0

    Compound Interest Calculator2.0 1.如果按照单利计算,本息又是多少呢? 2.假如30年之后要筹措到300万元的养老金,平均的年回报率是3%,那么,现在必须投入的本金是多 ...

  7. ACM2 递归 n分成k份

    //将n 分成k份的 分法总数 #include "stdafx.h" #include"stdio.h" #include<iostream> u ...

  8. python中字符串与列表的相互转换

    列表转字符串 list1 = ['abc' , 'def' , 'ghi'] str1 = ','.join(list1) str1 = '##'.join(list1) 字符串转列表 str1 = ...

  9. hdu----(1402)A * B Problem Plus(FFT模板)

    A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  10. Eclipse创建第一个springWebMVC项目

    1.第一步:配置中央调度器(DispatcherServlet) 2.第二步:配置处理器(Controller) 3.第三步:在applicationContext.xml文件中注册控制器 注:记得头 ...