zoukankan      html  css  js  c++  java
  • 栈的操作

    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    #define INIT_SIZE 20
    #define INCREMENT_SIZE 5
    
    typedef int SElemType;
    typedef int Status;
    
    /*
     * 存储结构
     */
    typedef struct
    {
        SElemType *base;    //栈尾指针
        SElemType *top;        //栈顶指针
        int size;            //栈的大小
    }SqStack;
    
    /*
     * 初始化栈
     */
    Status InitStack(SqStack *S)
    {
        S->base = (SElemType*) malloc(INIT_SIZE * sizeof(SElemType));
        if (!S->base)
        {
            exit(OVERFLOW);
        }
        S->top = S->base;
        S->size = INIT_SIZE;
        return OK;
    }
    
    /*
     * 销毁栈
     */
    Status DestroyStack(SqStack *S)
    {
        free(S->base);
        S->base = NULL;
        S->top = NULL;
        S->size = 0;
        return OK;
    }
    
    /*
     * 清空栈
     */
    Status ClearStack(SqStack *S)
    {
        S->top = S->base;
        return OK;
    }
    
    /*
     * 判断栈是否为空
     */
    Status IsEmpty(SqStack S)
    {
        if (S.top == S.base)
        {
            return TRUE;
        }
        else
            return FALSE;
    }
    
    /*
     * 获取栈的长度
     */
    int GetLength(SqStack S)
    {
        return S.top - S.base;
    }
    
    
    /*
     * 获取栈顶元素
     */
    Status GetTop(SqStack S, SElemType *e)
    {
        if (S.top > S.base)
        {
            *e = *(--S.top);
            return OK;
        }
        else
        {
            return ERROR;
        }
    }
    
    /*
     * 压栈
     */
    Status Push(SqStack *S, SElemType e)
    {
        if ((S->top - S->base) / sizeof(SElemType) >= S->size)
        {
            S->base = (SElemType*) realloc(S->base, (S->size + INCREMENT_SIZE) * sizeof(SElemType));
            if (!S->base)
            {
                exit(OVERFLOW);
            }
            S->top = S->base + S->size;
            S->size += INCREMENT_SIZE;
        }
        *S->top = e;
        S->top+=sizeof(SElemType);
        return OK;
    }
    
    /*
     * 退栈
     */
    Status Pop(SqStack *S, SElemType *e)
    {
        if (S->top == S->base)
        {
            return ERROR;
        }
        S->top-=sizeof(SElemType);;
        *e = *S->top;
        return OK;
    }
    
    /*
     * 访问元素
     */
    void visit(SElemType e)
    {
        printf("%d ", e);
    }
    
    /*
     * 遍历栈
     */
    Status TraverseStack(SqStack S, void (*visit)(SElemType))
    {
        while (S.top > S.base)
        {
            visit(*S.base);
            S.base += sizeof(SElemType);
        }
        return OK;
    }
    
    int main()
    {
        SqStack S;
        if (InitStack(&S))
        {
            SElemType e;
            int i;
    
            printf("init_success
    ");
    
            if (IsEmpty(S))
            {
                printf("Stack is empty
    ");
            }
    
            for (i = 0; i < 10; i++)
            {
                Push(&S, i);
            }
    
            GetTop(S, &e);
            printf("The first element is %d
    ", e);
    
            printf("length is %d
    ", GetLength(S));
    
            Pop(&S, &e);
            printf("Pop element is %d
    ", e);
    
            TraverseStack(S, *visit);
    
            if (DestroyStack(&S))
            {
                printf("
    destroy_success
    ");
            }
        }
    }
  • 相关阅读:
    I.MX6ULL LED C程序(转自左忠凯)
    I.MX6ULL的LED汇编程序
    Linux中的信号
    springboot的模板引擎之简介区分(一)
    springboot常用Starter介绍
    springboot拦截器之Filter和拦截器Interceptor之间的区别(六)
    springboot拦截器之多个自定义拦截器Interceptor的执行顺序(五)
    springboot拦截器之自定义拦截器Interceptor以及新旧配置的对比(四)
    springboot拦截器之自定义监听器listener(三)
    springboot拦截器之自定义原生servlet(二)
  • 原文地址:https://www.cnblogs.com/kxzh/p/10919829.html
Copyright © 2011-2022 走看看