zoukankan      html  css  js  c++  java
  • 数据结构栈的顺序存储(c语言描述)

      考研之路又挺近了一步,今天主要我自己写了一下栈的顺序存储,栈是一个后进先出的线性表,它只允许在表尾进行插入和删除,其实还是属于线性表的范畴,只要我们把线性表的一些相关操作搞清楚了,栈就很容易搞清楚了,首先我们要搞清楚栈顶其实就是表尾,而栈底是表头,下面来展示代码吧:

    1.声明结构体

    #define MAXSIZE 10  //容量 
    #define INSERTSIZE 5 //增加容量 
    typedef int ElemType;
    typedef struct{
        ElemType *top;  //指向栈顶的指针 
        ElemType *base;  //指向栈底的指针 
        int stackLength;  //栈的容量 
    }stack,*link;

    2.栈的初始化

    void initStack(stack *s)  //这里使用  stack *s  和 link s效果一模一样 
    {
        s->base=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
        if(!s->base)
        {
            printf("空间申请失败
    ");
        }
        s->top=s->base; //一开始栈顶和栈底在同一位置
        s->stackLength=MAXSIZE;  //栈的最大容量 
    } 

    3.入栈操作

    里面realloc其实是malloc的封装函数,重新申请空间的意思,可以将之前空间的数据赋值过去

    void push(stack *s,int e)
    {
        if((s->top-s->base)==s->stackLength)  //栈的空间满了 
        {
            s->base=(ElemType*)realloc(s->base,(s->stackLength+INSERTSIZE)*sizeof(ElemType));  //重新分配空间
            s->top=s->base+s->stackLength;  //分配栈顶的位置
            s->stackLength+=INSERTSIZE;   //设置最大容量 
        }
        *(s->top)=e; //给空间数值赋值
        s->top++; 
    }

    4.出栈操作

    ElemType pop(stack *s,int *e)//这里要用引用,传回数值
    {
        if(s->top==s->base)  //如果栈为空 
        {
            printf("栈为空,无法出栈
    ");
            return -1;
        }
        else
        {
            *e=*(--s->top);  //先将栈顶向下移一位再取出数据 
            return *e;
        }
    } 

    5.清空操作

    void clearStack(stack *s)
    {
        s->top=s->base;
    }

    6.销毁栈的操作

    //销毁栈
    void destroyStack(stack *s)
    {
        int length,i;
        length=s->top-s->base; //栈的容量
        for(i=0;i<length;i++)
        {
            free(s->base); //释放栈底空间 
            s->base++;
        } 
        s->top=s->base=NULL;
        s->stackLength=0;
    } 

    所有的代码如下:

    #include<stdlib.h>
    #include<stdio.h>
    
    #define MAXSIZE 10  //容量 
    #define INSERTSIZE 5 //增加容量 
    typedef int ElemType;
    typedef struct{
        ElemType *top;  //指向栈顶的指针 
        ElemType *base;  //指向栈底的指针 
        int stackLength;  //栈的容量 
    }stack,*link;
    
    
    //栈的初始化
    void initStack(stack *s)  //这里使用  stack *s  和 link s效果一模一样 
    {
        s->base=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
        if(!s->base)
        {
            printf("空间申请失败
    ");
        }
        s->top=s->base; //一开始栈顶和栈底在同一位置
        s->stackLength=MAXSIZE;  //栈的最大容量 
    } 
    
    //入栈
    void push(stack *s,int e)
    {
        if((s->top-s->base)==s->stackLength)  //栈的空间满了 
        {
            s->base=(ElemType*)realloc(s->base,(s->stackLength+INSERTSIZE)*sizeof(ElemType));  //重新分配空间
            s->top=s->base+s->stackLength;  //分配栈顶的位置
            s->stackLength+=INSERTSIZE;   //设置最大容量 
        }
        *(s->top)=e; //给空间数值赋值
        s->top++; 
    }
    
    //出栈
    ElemType pop(stack *s,int *e)//这里要用引用,传回数值
    {
        if(s->top==s->base)  //如果栈为空 
        {
            printf("栈为空,无法出栈
    ");
            return -1;
        }
        else
        {
            *e=*(--s->top);  //先将栈顶向下移一位再取出数据 
            return *e;
        }
    } 
    
    //清空 
    void clearStack(stack *s)
    {
        s->top=s->base;
    }
    
    
    //销毁栈
    void destroyStack(stack *s)
    {
        int length,i;
        length=s->top-s->base; //栈的容量
        for(i=0;i<length;i++)
        {
            free(s->base); //释放栈底空间 
            s->base++;
        } 
        s->top=s->base=NULL;
        s->stackLength=0;
    } 
    
    int main()
    {
        stack 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);
                    break;
                
                case 4:        //销毁栈的操作
                    destroyStack(&s);
                    printf("栈已销毁
    ");
                    break;
                    
                default:
                    printf("你输入的指令不正确
    ");   
            }
            printf("你的下一步指令为:");
            scanf("%d",&number);
        }
        return 0;
    }

      今天就这样了,如果大家有什么建议欢迎提出来。

  • 相关阅读:
    接口缓存--把接口放在redis数据库中,减少访问量
    使用vue和drf后台进行登录页面和注册页面(本文大概的疏通一下前后台是怎么交互的)
    vue导入css,js和放置html代码
    存储过程
    触发器
    视图
    pymysql模块使用
    权限管理
    多表数据查询
    单表数据查询
  • 原文地址:https://www.cnblogs.com/qian-yi/p/12721713.html
Copyright © 2011-2022 走看看