• 栈的顺序存储结构实现


    栈的顺序存储结构实现

    用数组来实现栈,首先定义栈类型SqStack,里面有两个指针,一个指向栈底,这个栈底初始化后将被指向数组指针,即第一个数组元素。而另一个一个指针指向栈顶,随着新元素不断被push进来,栈顶指针不断往上涨如何判断满栈了呢,那就要用到SqStack里面的第三个元素stacksize,它指明占空间的大小,即让top指针减去base指针的差去和stacksize比较,如果大于栈空间,则需要重新分配数组大小。同样对于栈的pop则将栈顶元素索取出来并让top减1,如下图所示,top的位置总是数据的上面,所以栈顶的数据应该是top-1。先检测top是否和base相等,因为这是空栈的条件,如果不等,则top必然在base上面,且栈不为空,top-1的位置就当然是栈顶的元素位置。对于获取栈中的数据长度,就是让top-base就可以了。
    图示:栈的状态示意图

    示例代码

    #include <stdio.h>
    #include <stdlib.h>
    
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    
    typedef int Status;
    typedef int SElemType;
    
    #define STACK_INIT_SIZE 100
    #define STACK_INCREMENT 10
    
    typedef struct 
    {
        SElemType *base; /* 在栈构造之前和销毁之后,base值为NULL */
        SElemType *top;  /* 栈顶指针 */
        int stacksize;   /* 当前已分配的存储空间,以元素为单位 */
    }SqStack;
    
    /* 构造一个空战 */
    Status InitStack(SqStack *S)
    {
        S->base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
        if(!S->base) 
            return ERROR;
        S->top = S->base;
        S->stacksize = STACK_INIT_SIZE;
        return OK;
    }
    
    /* 销毁栈S,S不再存在 */
    Status DestoryStack(SqStack *S)
    {
        if(!S->base)
            return ERROR;
        free(S->base);
        S->base = NULL;
        S->top = NULL;
        S->stacksize = 0;
        return OK;
    }
    
    /* 把栈S置为空栈 */
    Status ClearStack(SqStack *S)
    {   
        if(!S->base)
            return ERROR;
         S->top =  S->base;
        return OK;
    }
    
    /* 如果栈为空则返回TRUE,否则返回FALSE */
    Status StackEmpty(SqStack *S)
    {
        if(!S->base)
            return ERROR;
        if( S->top ==  S->base)
            return TRUE;
        else 
            return FALSE;
    }
    
    /* 返回栈的长度 */
    int StackLength(SqStack *S)
    {
        if(!S->base)
            return ERROR;
        return S->top - S->base;
    }
    
    /* 若栈不为空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR */
    Status GetTop(SqStack *S, SElemType *e)
    {
        if(!S->base || S->top == S->base) 
            return ERROR;
        *e = *(S->top-1);
        return OK;
    }
    
    /* 插入元素e为新的栈顶 */
    Status Push(SqStack *S, SElemType e)
    {
        if( S->top - S->base >= S->stacksize ) { /* 栈满,追加存储空间 */
            SElemType * ptr = (SElemType *)realloc( S->base,
                (S->stacksize + STACK_INCREMENT)*sizeof(SElemType) );
            if(!ptr)
                return ERROR;
            S->base = ptr;
            S->top = S->base + S->stacksize; /* top重新指向新的地址 */
            S->stacksize += STACK_INCREMENT;
        }
        *(S->top) = e;
        S->top++;
        return OK;    
    }
    
    /* 若栈不空,则弹出栈顶元素,用e保存返回值 */
    Status Pop(SqStack *S,SElemType *e)
    {
        if(S->top == S->base) /* 栈空了 */
            return ERROR;
        *e = *(S->top-1);
        S->top--;
        return OK;
    }
    
    /* 从栈顶往下打印栈中的数据 */
    void printSqStack(SqStack *S)
    {
        SElemType * p = S->top;
        while (p != S->base) {
            printf("%d ",*(p-1));
            p--;
        }
        printf("
    ");
    }
    
    int main()
    {
        SqStack S;
        SqStack * pS = &S;
        SElemType e;
    
        // 初始化栈
        InitStack(pS);
        
        // push 测试
        for(int i=1;i<=110;i++) {
            Push(pS,i);
        }
    
        // 获取栈长度测试
        printf("len %d
    ",StackLength(pS));
    
        // 弹出栈顶 
        Pop(pS,&e);
        printf("pop %d
    ",e);
    
        // 打印栈测试
        printSqStack(pS);
    
        // 获取栈顶测试
        GetTop(pS,&e);
        printf("top %d
    ",e);
    
        // 销毁测试
        DestoryStack(pS);
        printf("
    return 0
    ");
    }
    
  • 相关阅读:
    maven 私服的setting.xml配置
    制作移动版Win8系统
    spring jar 下载
    tomcat 卡在加载项目 解决办法
    ubuntu tomcat apr 安装
    js 对象数组 根据对象中的元素去重
    ztree 获取根节点
    自定义的强大的UITableViewCell
    CALayer与UIView的关系
    iOS 沙盒文件操作
  • 原文地址:https://www.cnblogs.com/wjundong/p/11623224.html
Copyright © 2020-2023  润新知