zoukankan      html  css  js  c++  java
  • 数据结构学习4——栈

    栈:一种只允许在一端进行插入和删除的线性表。向栈中插入元素叫进栈,从栈中删除数据元素叫出栈。

    栈有顺序存储和链式存储,顺序存储需要事先分配栈的内存空间,这里只讲链式存储。

    国际惯例,先上源代码,再说各个模块。

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<malloc.h>
     4 
     5 //栈的定义
     6 typedef struct node{
     7     int data;
     8     struct node *next;
     9 }Stack;
    10 
    11 //栈的初始化
    12 void StackInit(Stack *top)
    13 {
    14     //将栈顶指针置为空
    15     top->next=NULL;
    16 }
    17 
    18 //判断栈是否为空:为空返回1,不为空返回0
    19 int IsEmpty(Stack *top)
    20 {
    21     //栈顶是否为空,栈顶为空即栈为空
    22     if(top->next==NULL)
    23     {
    24         return 1;
    25     }
    26     return 0;
    27 }
    28 
    29 //进栈:将元素element压入栈中。成功返回1,失败返回0
    30 int Push(Stack *top,int element)
    31 {
    32     //创建新的节点,存放元素element
    33     Stack *p;
    34     p=(Stack*)malloc(sizeof(Stack));
    35     if(p==NULL)
    36     {
    37         return 0;
    38     }
    39     p->data=element;
    40     //入栈时栈顶不变,新的节点放入栈顶下面.即栈顶指针后移
    41     p->next=top->next;
    42     top->next=p;
    43     return 1;
    44 }
    45 
    46 //出栈:出栈的数据元素给element
    47 int Pop(Stack *top,int *element)
    48 {
    49     if(IsEmpty(top))
    50     {
    51         return 0;
    52     }
    53     Stack *p;
    54     p=top->next;//栈顶下面第一个节点,即是要出栈的
    55     *element=p->data;
    56     top->next=p->next;//栈顶前移
    57     free(p);//释放内存空间
    58     return 1;
    59 }
    60 
    61 int main()
    62 {
    63     int x;
    64     Stack *top=(Stack*)malloc(sizeof(Stack));//栈顶
    65     StackInit(top);//栈初始化
    66     printf("input some positive integers:\n");
    67     scanf("%d",&x);
    68     while(x>0)
    69     {
    70         Push(top,x);//进栈
    71         scanf("%d",&x);
    72     }
    73     Stack *p=top;
    74     //输出栈中元素(从栈顶开始)
    75     printf("elemet in stack:\n");
    76     while(p)
    77     {
    78         printf("%d ",p->data);
    79         p=p->next;
    80     }
    81     p=NULL;
    82     printf("\n");
    83     //出栈,输出出栈元素
    84     printf("Pop stack element:\n");
    85     while(Pop(top,&x))
    86     {
    87         printf("%d ",x);
    88     }
    89     printf("\n");
    90     //注:出栈时已经释放掉了栈中的内存空间
    91     free(top);
    92 
    93     return 0;
    94 }

    栈是一种单链表,但跟单链表不同的是,对栈的操作只需要栈顶即可,即不需要访问栈中其他位置。

    1.栈的初始化:将栈顶指针置为NULL

    2.判断栈是否为空:查看栈顶指针是否为空,而不是查看栈顶是否为空。

    3.进栈:进栈时栈顶指针后移,怎么理解呢?就是栈顶不变,将要入栈的节点放在栈顶下面,即栈顶指针只想入栈的节点,每次进栈时都放在栈的最上面。

    4.出栈:栈顶指针前移。就是将栈顶下面的节点删除掉,每次出栈都将栈最上面的节点删除掉。

    注:出栈时要将出栈的那块内存空间释放掉,最后,将栈清空后,还要将栈顶的内存空间也释放掉。

  • 相关阅读:
    基于 Docker 安装 RocketMQ
    167. 两数之和 II
    阿里云的使用
    自动关机程序
    C语言学习关于数据类型的一些知识点(初学者)
    关于C语言学习的一些感想(初学者)
    c# 第14节 字符方法、转义字符、字符串的方法
    c# 第13节 迭代语句、while、do...while、for、foreach、goto
    c# 第12节 分支语句if、switch、三位运算符
    c# 第11节 运算符大全
  • 原文地址:https://www.cnblogs.com/Romi/p/2660336.html
Copyright © 2011-2022 走看看