当前位置:   article > 正文

栈数据结构_栈是一种具有

栈是一种具有

栈是一种先进后出的数据结构,可以分为:顺序栈和链式栈

一、顺序栈

 1、其结构如下图所示:

2、栈的基本操作,只有如下的七个(具体用法

  • push( ) 入栈
  • pop( ) 出栈
  • empty( ) 是否为空
  • top( ) 返回栈顶元素
  • size( ) 返回栈中元素个数
  • swap() 交换
  • emplace() 
  1. #include<iostream>
  2. #include<stack>
  3. #include<string>
  4. using namespace std;
  5. void StackOperator(int num)
  6. {
  7. stack<int> s1;
  8. for (int i = 0; i < num; i++)
  9. {
  10. s1.push(i); // 入栈操作
  11. }
  12. cout << "s1栈的大小为:" << s1.size() << endl;
  13. // 遍历栈中的元素
  14. while (!s1.empty())
  15. {
  16. // 将栈顶的元素输出
  17. cout << s1.top() << " ";
  18. // 将当前栈顶的元素删除,让下一个元素成为栈顶元素
  19. s1.pop();
  20. }
  21. cout << endl;
  22. }
  23. int main()
  24. {
  25. StackOperator(10);
  26. cin.get();
  27. }

  

3、注意:栈与vector容器的异同

  • 栈和vector容器都是从末尾插入新元素。
  • 栈只能先进后出,从最后一个开始元素输出;而vector容器是从头开始输出数据,通过 v.begin()来进行。

二、链式栈

1、链式栈是用链表的方式来进行连接的。如下图所示,pTop 指向开头,pBotton 指向结尾。一般为了处理方便,让 pBotton 指向一个空结点,即最后一个结点的数据为空。

  

2、创建一个链式栈

(1)、创建栈的第一个结点,并用 pTop、pBotton 来对其进行初始化。此时 pTop、pBotton 均指向该栈的第一个结点。

  1. // 创建栈的第一个结点,并用头指针和尾指针指向它
  2. void InitStack(PSTACK p)
  3. {
  4. // 使用malloc动态申请一个NodeList类型的内存空间,并用pTop指针指向它
  5. p->pTop = (PNODE)malloc(sizeof(NODE));
  6. if (p->pTop==NULL)
  7. {
  8. cout << "内存分配失败" << endl;
  9. }
  10. else
  11. {
  12. p->pBotton = p->pTop;
  13. p->pTop->next = NULL;
  14. }
  15. }

  

(2)、将第一个元素压入到栈中,成为该栈的第二个结点

  1. // 将元素压入到创建的栈中
  2. void PushElem(PSTACK p1,int val)
  3. {
  4. PNODE pNew = new NODE();
  5. pNew->data = 20;
  6. pNew->next = p1->pTop;
  7. p1->pTop = pNew;
  8. }

  

(3)、将第三、四个元素分别压入到栈中,如下图

  

3、实例

  1. #include<iostream>
  2. #include<malloc.h>
  3. #include<string>
  4. using namespace std;
  5. // 定义一个结点
  6. // NODE 相当于 NodeList的别名
  7. // *PNODE 相当于 NodeList* 类型
  8. typedef struct NodeList
  9. {
  10. int data;
  11. NodeList * next;
  12. }NODE, *PNODE;
  13. //自定义一个栈的结构体类型,存放头指针和尾指针
  14. typedef struct Stack
  15. {
  16. PNODE pTop;
  17. PNODE pBotton;
  18. }STACK, *PSTACK;
  19. // 创建栈的第一个结点,并用头指针和尾指针指向它
  20. void InitStack(PSTACK p)
  21. {
  22. // 使用malloc动态申请一个NodeList类型的内存空间,并用pTop指针指向它
  23. p->pTop = (PNODE)malloc(sizeof(NODE));
  24. if (p->pTop==NULL)
  25. {
  26. cout << "内存分配失败" << endl;
  27. }
  28. else
  29. {
  30. p->pBotton = p->pTop;
  31. p->pTop->data = 10;
  32. p->pTop->next = NULL;
  33. }
  34. }
  35. // 将元素压入到创建的栈中
  36. void PushElem(PSTACK p1,int val)
  37. {
  38. // 方法二
  39. PNODE pNew = new NODE();
  40. pNew->data = val;
  41. pNew->next = p1->pTop;
  42. p1->pTop = pNew;
  43. }
  44. // 遍历栈中所有元素
  45. void TraverseStack(const PSTACK pS)
  46. {
  47. PNODE p = pS->pTop;
  48. while (p!=pS->pBotton)
  49. {
  50. cout << p->data << endl;
  51. p = p->next;
  52. }
  53. }
  54. // 出栈操作,删除栈顶的元素
  55. void PopStack(PSTACK pS)
  56. {
  57. PNODE p = pS->pTop;
  58. pS->pTop = pS->pTop->next;
  59. delete p;
  60. }
  61. int main()
  62. {
  63. STACK s;
  64. InitStack(&s);
  65. PushElem(&s, 10);
  66. PushElem(&s, 20);
  67. PushElem(&s, 30);
  68. PushElem(&s, 40);
  69. TraverseStack(&s);
  70. cout << "-------------------------------\n";
  71. PopStack(&s);
  72. TraverseStack(&s);
  73. cin.get();
  74. }

 运行结果如下:


三、栈的应用

  • 函数调用,递归调用
  • 中断
  • 表达式求值
  • 内存分配
  • 缓冲处理
  • 迷宫

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/796281
推荐阅读
相关标签
  

闽ICP备14008679号