• 数据结构栈的链式存储(c语言描述)


      今天刚一共写了栈的顺序存储,接下来我把栈的链式存储也发一下吧

    1.定义结构体

    stackNode结构体储存着链表中结点的信息

    stackPointer结构体储存着指向链表尾部(即栈顶)的指针和链表的长度

    typedef struct stackNode
    {
        ElemType data; //储存数据
        struct  stackNode *next ;// 指向下一个结点 
    }stackNode,*stackNodePtr;
    
    typedef struct stackPointer
    {
        stackNodePtr top; //top指针 ,指向栈顶 
        int count;//储存栈元素的数量 
    }stackPointer;

    2.初始化声明:链表为空,所以指向链表的指针为null,

    void initStack(stackPointer *s)
    {
        s->top=NULL; 
        s->count=0;//初始化栈的空间为0 
    }

    3.入栈操作

    首先为入栈的数据申请一个结点,

    当链表为空时,指向链表的指针指向这个结点,这的结点指针域为空,链表数量增加

    当链表不为空时,这个结点的指针指向当前链表的表尾,自己成为这个链表的表尾,然后指向链表尾部的指针指向这个结点,链表数量增加

    void push(stackPointer *s,int e)
    {
        stackNodePtr currentNode=(stackNodePtr)malloc(sizeof(stackNode)); //为要申请的结点申请空间
        currentNode->data=e;
        if(!currentNode)
        {
            printf("动态申请空间失败");    
        }
        if(s->count==0)//如果栈的空间原本为空
        {
            s->top=currentNode;
            currentNode->next=NULL;
            s->count++;
        }
        else //栈的空间不为空 
        {
            currentNode->next=s->top;
            s->top=currentNode;
            s->count++;
        }
    }

    4.出栈操作

    ElemType pop(stackPointer *s,int *e)
    {
        if(s->count==0)//栈为空时 
        {
            printf("栈为空,无法出栈
    ");
            return -1;
        }
        else
        {
            *e=s->top->data;//赋值
            s->top=s->top->next;//向下传递 
            s->count--;
            return *e;
        }
    }

    5.清空栈的操作

    void clearStack(stackPointer *s)
    {
        s->count=0;
        s->top=NULL;
    }

    6.销毁栈的操作

    void destroyStack(stackPointer *s)
    {
        int i;
        stackNodePtr temp;  //这里不准用 stackPointer *temp ,因为我们要的只是指向下一个结构体的指针,而不是一个结构体里面存在指向下一个结构体的指针
        for(i=0;i<s->count;i++)
        {
            temp=s->top->next;
            free(s->top);
            s->top=temp;
        }
        s->top=NULL; //一开始指向结构体的指针为空 
        s->count=0;  //栈的长度为0 
    }

    所有的代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef int ElemType;
    typedef struct stackNode
    {
        ElemType data; //储存数据
        struct  stackNode *next ;// 指向下一个结点 
    }stackNode,*stackNodePtr;
    
    typedef struct stackPointer
    {
        stackNodePtr top; //top指针 ,指向栈顶 
        int count;//储存栈元素的数量 
    }stackPointer;
    
    //初始化栈的链式存储 
    void initStack(stackPointer *s)
    {
        s->top=NULL; 
        s->count=0;//初始化栈的空间为0 
    }
    
    //入栈
    void push(stackPointer *s,int e)
    {
        stackNodePtr currentNode=(stackNodePtr)malloc(sizeof(stackNode)); //为要申请的结点申请空间
        currentNode->data=e;
        if(!currentNode)
        {
            printf("动态申请空间失败");    
        }
        if(s->count==0)//如果栈的空间原本为空
        {
            s->top=currentNode;
            currentNode->next=NULL;
            s->count++;
        }
        else //栈的空间不为空 
        {
            currentNode->next=s->top;
            s->top=currentNode;
            s->count++;
        }
    }
    
    //出栈操作
    ElemType pop(stackPointer *s,int *e)
    {
        if(s->count==0)//栈为空时 
        {
            printf("栈为空,无法出栈
    ");
            return -1;
        }
        else
        {
            *e=s->top->data;//赋值
            s->top=s->top->next;//向下传递 
            s->count--;
            return *e;
        }
    }
    
    //清空栈的操作
    void clearStack(stackPointer *s)
    {
        s->count=0;
        s->top=NULL;
    }
    
    //销毁栈
    void destroyStack(stackPointer *s)
    {
        int i;
        stackNodePtr temp;  //这里不准用 stackPointer *temp ,因为我们要的只是指向下一个结构体的指针,而不是一个结构体里面存在指向下一个结构体的指针
        for(i=0;i<s->count;i++)
        {
            temp=s->top->next;
            free(s->top);
            s->top=temp;
        }
        s->top=NULL; //一开始指向结构体的指针为空 
        s->count=0;  //栈的长度为0 
    }
    
    int main()
    {
        stackPointer s;
        initStack(&s);//栈的初始化
        
        printf("结束操作-------0
    ");
        printf("入栈操作-------1
    ");
        printf("出栈操作-------2
    ");
        printf("清空栈的操作-------3
    ");
        printf("销毁栈的操作-------4
    ");
         
        int number,e; //指令 ,数据 
        printf("请输入指令");
        scanf("%d",&number);
        
        while(number!=0)
        {
            switch(number)
            {
                case 1:         //入栈操作    
                    printf("入栈的数值为:");
                    scanf("%d",&e);
                    push(&s,e);
                    break;
                
                case 2:         //出栈操作 
                    e=pop(&s,&e);
                    printf("出栈的元素值为:%d
    ",e);
                    break;
                
                case 3:       //清空栈的操作
                    clearStack(&s);
                    printf("栈已清空
    ");
                    break;
                
                case 4:        //销毁栈的操作
                    destroyStack(&s);
                    printf("栈已销毁
    ");
                    break;
                    
                default:
                    printf("你输入的指令不正确
    ");   
            }
            printf("你的下一步指令为:");
            scanf("%d",&number);
        }
        return 0;
    }

      这样就结束了,欢迎大家指出我的不足。

  • 相关阅读:
    LeetCode:Plus One
    LeetCode:Text Justification
    LeetCode:Sqrt(x)
    LeetCode:Climbing Stairs(编程之美2.9-斐波那契数列)
    LeetCode:Simplify Path
    LeetCode:Edit Distance
    LeetCode:Set Matrix Zeroes
    LeetCode:Search in Rotated Sorted Array I II
    LeetCode:Search a 2D Matrix
    LeetCode:Sort Colors
  • 原文地址:https://www.cnblogs.com/qian-yi/p/12721946.html
Copyright © 2020-2023  润新知