zoukankan      html  css  js  c++  java
  • 栈的顺序存储结构实现

    栈的顺序存储结构实现

    用数组来实现栈,首先定义栈类型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
    ");
    }
    
  • 相关阅读:
    Python 安装Twisted 提示python version 2.7 required,which was not found in the registry
    Openfire Strophe开发中文乱码问题
    css div 垂直居中
    How to create custom methods for use in spring security expression language annotations
    How to check “hasRole” in Java Code with Spring Security?
    Android 显示/隐藏 应用图标
    Android 当媒体变更后,通知其他应用重新扫描
    文件上传那些事儿
    专题:点滴Javascript
    主流动画实现方式总结
  • 原文地址:https://www.cnblogs.com/wjundong/p/11623224.html
Copyright © 2011-2022 走看看