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;
    }

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

  • 相关阅读:
    使用CustomValidate自定义验证控件
    C#中金额的大小写转换
    Andriod出错之Unable to build: the file dx.jar was not loaded from the SDK folder!
    VC 编写的打字练习
    机房工作笔记Ping只有单向通
    web服务协同学习笔记(1)
    Dll 学习3 将MDI子窗口封装在DLL中
    机房工作学习文件共享
    Andriod出错之Failed to find an AVD compatible with target 'Android 2.2'
    Andriod出错之wrapper was not properly loaded first
  • 原文地址:https://www.cnblogs.com/qian-yi/p/12721713.html
Copyright © 2011-2022 走看看