• 线性表-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作)


    目录

    前言

    1.定义

    2.栈的特点

    3.栈的储存方式

    3.1数组栈

    3.2链栈

     4.栈的基本操作(C语言)

    4.1初始化 

     4.2判断是否满栈

    4.3判断空栈

     4.4 入栈

    4.5 出栈

    4.6获取栈顶元素

     4.7遍历栈

     4.8清空栈

     完整代码示例


    前言

            大家好呀!今天我们开始学习新的线性表结构----栈,前面我们学习了链表以及链表的相关操作,那么栈跟链表有什么区别呢,操作如何呢?下面就一起来看看吧!

    1.定义

            栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

    2.栈的特点

            栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针

            栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为出栈/退栈(POP)。栈也称为先进后出表。

     

    3.栈的储存方式

    栈的存储方式有两种:数组栈链栈,即栈的数组存储和链式存储。

     数组栈:数组栈是通过数组的形式去存放数据的,然后定义一个栈顶top指针指向当前栈顶的位置,这个位置也就是数组最后一个位置

    链表栈:链表栈就是去通过链表节点的形式去储存数据,然后建立链式结构,对这个链表进行栈的相关操作,以达到栈的特点。二者的节点写法分别如下所示:

    3.1数组栈
    1. //01 数组栈
    2. typedef struct sqstack {
    3. ElemType date[Maxsize];//数据
    4. int top;//数组栈的栈顶指针
    5. }SqStack;
    3.2链栈
    1. //02链表栈
    2. typedef struct linknode {
    3. ElemType date[Maxsize];//数据
    4. struct linknode* next;//指向下一个节点的指针
    5. }* LiStack;

    (本文主要讲解数组栈) 

     4.栈的基本操作(C语言)

     栈的操作方法有以下方法:

    1. #include
    2. #include
    3. #define Maxsize 10//最大空间容量
    4. //数据类型
    5. typedef struct datatype {
    6. int age;
    7. char name[10];
    8. }ElemType;
    9. //数组栈
    10. typedef struct sqstack {
    11. ElemType date[Maxsize];//数据
    12. int top;//数组栈的栈顶指针
    13. }Stack;
    14. initStack(Stack *L);//初始化栈
    15. isFull(Stack *L);//判断是否满栈
    16. isEmpty(Stack *L);//判断是否空栈
    17. push(Stack *L,ElemType date);//入栈
    18. pop(Stack *L);//出栈
    19. top_date(Stack* L);//获取栈顶元素
    20. show_stack(Stack *L);//遍历栈
    21. clear_stack(Stack *L);//清空栈元素

    【注:以上均是数组栈的操作方法】

    4.1初始化 

    让栈顶元素初始化为-1,即 L->top=-1;

    1. //初始化
    2. void initStack(Stack *L) {
    3. L->top = -1;
    4. }
     4.2判断是否满栈

    判断满栈的方法就是看栈顶元素位置是否达到最大容量

    1. //判断是否满了
    2. int isfull(Stack *L) {
    3. if (L->top == Maxsize - 1) {//此时栈已满
    4. printf("The stack is full\n");
    5. return 1;
    6. }
    7. return 0;
    8. }
    4.3判断空栈

    同样的判断是否空栈,只需要看栈顶top的位置是否为初始化的时候,即L->top==-1

    1. //判断是否为空栈
    2. int isEmpty(Stack *L) {
    3. if (L->top == -1) {
    4. printf("The stack is empty\n");
    5. return 1;
    6. }
    7. return 0;
    8. }
     4.4 入栈

    进行入栈操作的时候,每次放入一个数据后,栈顶指针依次向上移动一位即可,如图所示:

    1. //入栈
    2. void push(Stack *L,ElemType date){
    3. if (isfull(L)) { //判断栈是否满了
    4. printf("failed to push\n");
    5. return;
    6. }
    7. else {
    8. L->top+=1;
    9. L->date[L->top].age = date.age;
    10. strcpy(L->date[L->top].name, date.name);
    11. }
    12. }
    4.5 出栈

    进行出栈操作时,取出栈顶元素后,栈顶指针依次向下移动一位,如下所示:

    1. //出栈
    2. ElemType pop(Stack *L) {
    3. ElemType pop_date = { 0 };
    4. //先判断是不是空栈
    5. if (isEmpty(L)) {
    6. return pop_date;
    7. }
    8. pop_date = L->date[L->top];
    9. L->top--;
    10. return pop_date;
    11. }
    4.6获取栈顶元素

    获取栈顶元素就不进行出栈操作,直接返回栈顶元素即可。

    1. //获取栈顶元素(不出栈)
    2. ElemType get_topdate(Stack* L) {
    3. return L->date[L->top];
    4. }
     4.7遍历栈

    遍历栈,即当栈不为空的时候,从栈顶开始往下依次输出数据即可。

    1. //遍历栈,输出数据
    2. void show_stack(Stack *L) {
    3. if (!isEmpty(L)) {
    4. for (int i = L->top; i >= 0; i--) {
    5. printf("%d %s\n", L->date[i].age, L->date[i].name);
    6. }
    7. }
    8. }
     4.8清空栈

    清空栈,只需要让栈顶指针回归到初始化即可,L->top=-1;

    1. //清空栈
    2. void clear_stack(Stack *L) {
    3. L->top = -1;//直接让栈顶回归就行了
    4. //之前的那些数据不会被删除,但是引索找不到了,下次入栈就会把这些数据给覆盖掉
    5. }

     完整代码示例

    1. #include
    2. #include
    3. #define Maxsize 10//设置最大空间容量
    4. typedef struct datatype {
    5. int age;
    6. char name[10];
    7. }ElemType;
    8. // 数组栈
    9. typedef struct sqstack {
    10. ElemType date[Maxsize];//数据
    11. int top;//数组栈的栈顶指针
    12. }Stack;
    13. //初始化
    14. void initStack(Stack *L) {
    15. L->top = -1;
    16. }
    17. //判断是否满了
    18. int isfull(Stack *L) {
    19. if (L->top == Maxsize - 1) {//此时栈已满
    20. printf("The stack is full\,");
    21. return 1;
    22. }
    23. return 0;
    24. }
    25. //入栈
    26. void push(Stack *L,ElemType date){
    27. if (isfull(L)) {
    28. printf("failed to push\n");
    29. return;
    30. }
    31. else {
    32. L->top+=1;
    33. L->date[L->top].age = date.age;
    34. strcpy(L->date[L->top].name, date.name);
    35. }
    36. }
    37. //判断是否为空栈
    38. int isEmpty(Stack *L) {
    39. if (L->top == -1) {
    40. printf("The stack is empty\n");
    41. return 1;
    42. }
    43. return 0;
    44. }
    45. //出栈
    46. ElemType pop(Stack *L) {
    47. ElemType pop_date = { 0 };
    48. //先判断是不是空栈
    49. if (isEmpty(L)) {
    50. return pop_date;
    51. }
    52. pop_date = L->date[L->top];
    53. L->top--;
    54. return pop_date;
    55. }
    56. //获取栈顶元素(不出栈)
    57. ElemType get_topdate(Stack* L) {
    58. return L->date[L->top];
    59. }
    60. //清空栈
    61. void clear_stack(Stack *L) {
    62. L->top = -1;//直接让栈顶回归就行了
    63. //之前的那些数据不会被删除,但是引索找不到了,下次入栈就会把这些数据给覆盖掉
    64. }
    65. //遍历栈,输出数据
    66. void show_stack(Stack *L) {
    67. if (!isEmpty(L)) {
    68. for (int i = L->top; i >= 0; i--) {
    69. printf("%d %s\n", L->date[i].age, L->date[i].name);
    70. }
    71. }
    72. }
    73. int main() {
    74. Stack stack ;
    75. ElemType date[4] = { {15,"Jack"},{16,"Amy"} ,{15,"John"},{17,"Tom"}};
    76. initStack(&stack);
    77. for(int i=0;i<4;i++)
    78. push(&stack, date[i]);//依次入栈
    79. show_stack(&stack); //遍历栈
    80. ElemType pop_date= pop(&stack);//出栈
    81. printf("出栈元素为:%d %s\n", pop_date.age, pop_date.name);
    82. ElemType top_date = get_topdate(&stack);//获取栈顶元素
    83. printf("栈顶元素为:%d %s\n", top_date.age, top_date.name);
    84. clear_stack(&stack);//清空栈
    85. }
    86. //测试结果
    87. /*17 Tom
    88. 15 John
    89. 16 Amy
    90. 15 Jack
    91. 出栈元素为:17 Tom
    92. 栈顶元素为:15 John*/

    好啦,以上就是本期的全部内容了,我们下一期再见!see you!

    分享一张壁纸: 

  • 相关阅读:
    基于分布鲁棒优化的电-气-热综合能源系统日前经经济调度
    [QT]day1
    nginx 反向代理配置
    ABB电磁流量计维修信号变送器维修41F/E4技术参数
    How to config secured and stable Jenkins connection
    设计模式14、命令模式 Command
    C# Replace:一个熟悉而又陌生的替换
    QT 中 Graphics View 程序例子-Diagram Scene Example
    clock_gettime
    EDLP:全面保护邮件数据防泄露,确保企业数据安全!
  • 原文地址:https://blog.csdn.net/m0_73633088/article/details/132902177