• 栈stack(2):栈的链表实现


    定义


      从上一篇我们知道,栈(stack)是一个只允许一端进行删除插入操作的线性表。同时,我们联想到线性表的链式结构,其特点是用一组任意的存储单元存储线性表的数据元素,因此我们选择使用链表去实现栈,规定这种实现办法叫做链栈。

      

    主要过程


    一.申明结构体类型

     1.node  结点结构体类型    

    typedef struct Node
    {
            SElemType data;  //SElemType 指任意数据类型,如int,float
            struct Node *next;
    }node;
    

      

     2.stack  栈结构体类型        

    typedef struct Stack
    {
            struct Node *top;  //记录栈顶位置
            int count;  //记录链栈长度
    }stack;

    二.栈初始化

     1.为结点top申请内存,这里我们假设申请到的内存的地址为为0X01。

     2.count=0

      

    三.入栈

     1.定义一个node *型变量p,为其申请内存,这里我们假设申请到的内存的地址为0x02

          

     2.将新结点串入链栈,即是新结点p指向top,p->next=stack->top,注意:指向的方向与链表有所不同,这里是指向旧结构体,即栈底

          

      3.将结点串入下一结点,即是top=p;同时count++

          

      四.出栈

       1.定义一个node *型的变量p,令p=top,结点top串入下一结点

          

       2.把结点p free();释放,即0X02所在的数据域与指针域与被释放。 

           

    用处 


    那么初学者都会想:教练,我学了链栈能干什么?

      可以做以下projects,这些projects都是符合后进先出(LIFO)原则的:

        

    代码


      

    /*************************************************************************
    	> File Name:链栈(link_stack)
    	> Author: Bw98
    	> Mail: 786016746@qq.com
    	> Blog: www.cnblogs.com/Bw98blogs/
    	> Created Time: MON 17th Jul. 2017
     ************************************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #define OK 1
    typedef int SElemType;
    
    typedef struct Node
    {
            SElemType data;
            struct Node *next;
    }node;
    
    typedef struct Stack
    {
            struct Node *top;
            int count;  //长度
    }stack;
    
    int init_stack(stack *s);  //初始化为空栈
    int if_empty_stack(stack *s);
    int push(stack *s,int elem);  //入栈
    int pop(stack *s,SElemType *e);  //出栈
    int get_top(stack *s);  //显示栈顶元素
    int show_stack(stack *s);
    int clear_stack(stack *s);  //链栈置空
    int destroy_stack(stack *s);  //摧毁栈
    int length_stack(stack *s);  //链栈长度
    
    int main()
    {
            stack s;
            SElemType elem;
            int a;
            SElemType *elem2=&a;
            init_stack(&s);
            is_empty_stack(&s);
            printf("入栈开始:
    ");
            while(scanf("%d",&elem)!=EOF)
            {
                    getchar();
                    push(&s,elem);
            }
            show_stack(&s);
            printf("该栈的栈顶元素为:
    ");
            get_top(&s);
            pop(&s,elem2);
            printf("出栈元素为:%d
    ",*elem2);
            clear_stack(&s);
            is_empty_stack(&s);
            return 0;
    }
    
    int init_stack(stack *s)
    {
            s->top=(node *)malloc(sizeof(node));
            s->count=0;
            return OK;
    }
    
    int is_empty_stack(stack *s)
    {
            if(s->count==0)
                    printf("链栈为空!
    ");
            else
                    printf("链栈不为空!
    ");
            return OK;
    }
    
    int clear_stack(stack *s)
    {
            node *p=(node *)malloc(sizeof(node));
            p=s->top;
            while(s->count)
            {
                    p=s->top;
                    s->top=s->top->next;
                    free(p);
                    s->count--;
            }
            //s->count=0;
            printf("清除完毕!
    ");
            return OK;
    }
    int length_stack(stack *s)
    {
            return s->count;
    }
    
    int push(stack *s,SElemType x)
    {
            node *p=(node *)malloc(sizeof(node));
            p->next=s->top;
            s->top=p;
            s->count++;
            s->top->data=x;
            printf("已入栈
    ");
            return OK;
    }
    
    int get_top(stack *s)
    {
            if(s->count!=0)
            {
                     printf("%d
    ",s->top->data);
            }
            else
                    printf("栈为空,无法返回栈顶元素!
    ");
            return OK;
    }
    
    int pop(stack *s,SElemType *e)
    {
            if(s->count==0)
                    printf("栈为空,无法实现出栈
    ");
            else
            {
                    *e=s->top->data;
                    node *p=(node*)malloc(sizeof(node));
                    p=s->top;
                    s->top=s->top->next;
                    free(p);
                    printf("出栈完毕!
    ");
                    s->count--;
            }
            return OK;
    }
    
    int show_stack(stack *s)
    {
            printf("栈内元素如下
    ");
    
            if(s->count)
            {
                    node *p=s->top;
                    int i;
                    for(i=1;i<=s->count;i++)
                    {
                            printf("%d ",s->top->data);
                            s->top=s->top->next;
                    }
                    s->top=p;
            }
            if(s->count==0)
                    printf("空栈,无法查看栈内元素!
    ");
            return OK;
    }
    
    ————全心全意投入,拒绝画地为牢
  • 相关阅读:
    Java IO 之 RandomAccessFile 操作文件内容
    Java IO 之 FileFilter与FilenameFilter
    Java IO 之 File 的创建、重命名与遍历
    Java IO 之 System类
    JVM内存区域配置
    切换 显示与隐藏页面元素
    thead tfoot tbody标签的使用
    使用锚点在HTML页面中快速移动
    ASP.NET Core 项目归档
    检测到有潜在危险的 Request.Form 值 转
  • 原文地址:https://www.cnblogs.com/Bw98blogs/p/7194214.html
Copyright © 2020-2023  润新知