美文网首页
数据结构与算法之栈的顺序存储表示(自动扩容)

数据结构与算法之栈的顺序存储表示(自动扩容)

作者: LiChangBao | 来源:发表于2017-08-29 21:04 被阅读0次
    //栈的顺序存储表示(自动扩容)
    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    
    #define STACK_INIT_SIZE 10
    #define STACK_INCREMENT 2
    
    struct SqStack{
    
        int *base;
        int *top;
        int stacksize;
    
    };
    
    //构造一个空栈
    void InitStack(struct SqStack *s){
        
        s->base = (int *)malloc(STACK_INIT_SIZE*sizeof(int));
    
        if(s->base==NULL)
        {
            printf("内存分配失败!\n");
            exit(1);
        }
    
        s->top = s->base;
        s->stacksize = STACK_INIT_SIZE;
    
    }
    
    //销毁栈
    void DestoryStack(struct SqStack *s){
    
        free(s->base);//分配的内存是连续的
    
        s->stacksize = 0;
        s->base = NULL;
        s->top = NULL;
        
    }
    
    //清空栈
    void ClearStack(struct SqStack *s){
    
        s->top = s->base;
        s->stacksize = 0;
    }
    
    //判断栈是否为空
    bool EmptyStack(struct SqStack *s){
        
        if(s->base==s->top)
            return true;
        else
            return false;
    }
    
    //返回栈中的元素个数
    int StackLength(struct SqStack s){
        
        if(s.base==s.top)
            return 0;
        else
            return s.top - s.base;
    }
    
    //获取栈顶元素
    int GetTop(struct SqStack s){
        
        if(s.base==s.top)
            return -1;
        else
            return *--s.top;
    }
    
    //入栈
    void Push(struct SqStack *s,int value){
        
        if(s->top-s->base>=s->stacksize){
            
            s->base = (int *)realloc(s->base,(STACK_INCREMENT+s->stacksize)*sizeof(int));
            if(s->base==NULL)
            {
                printf("内存分配失败!\n");
                exit(1);
            }
            else{
                
                s->top = s->base + s->stacksize;
                s->stacksize += STACK_INCREMENT;
                *(s->top) = value;
            }
        }
    
        *(s->top) = value;
        s->top++;
    }
    
    //出栈
    bool Pop(struct SqStack *s,int *e){
        
        if(s->base==s->top)
        {
            return false;
        }
    
        (*e) = *(--s->top);
            return true;
    }
    
    //遍历栈
    void StackTraverse(struct SqStack s){
        
        //从栈顶开始
        while(s.top>s.base){
    
            s.top--;
            printf("%d ",*(s.top));
        }
    
        //从栈底开始
        //while(s.base<s.top){
        //  printf("%d ",*s.base++);
        //}
    
        printf("\n");
    }
    
    int main()
    {
        struct SqStack s;
        int i=1;
        int e;
    
        InitStack(&s);//构造一个空栈  
    
        for(i=1;i<=13;i++){
            Push(&s,i);//进行入栈
        }
        printf("遍历栈元素如下:\n");
        StackTraverse(s);//遍历栈(不要传递s的地址,否者会影响top指针)
    
        printf("出栈操作元素如下:\n");
        for(i=1;i<=13;i++){
    
            if(Pop(&s,&e))
            {
                printf("%d ",e);
            }else{
                printf("出栈失败\n");
            }
        }
        printf("\n");
        
        //再次进行入栈,不然会影响后续测试
        for(i=1;i<=13;i++){
            Push(&s,i);
        }
    
        //获取栈顶元素
        printf("栈顶元素:%d\n",GetTop(s));
    
        //获取栈含有元素个数
        printf("栈含有的元素个数为:%d\n",StackLength(s));
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:数据结构与算法之栈的顺序存储表示(自动扩容)

          本文链接:https://www.haomeiwen.com/subject/spuadxtx.html