• 栈的实现----链栈


    /*
    Name: 栈的链式实现
    Copyright:
    Author:
    Date:
    Description:
    */

    #ifndef STACK_H_INCLUDED
    #define STACK_H_INCLUDED

    #include "ds.h" //for Status,OK ...

    #ifndef ElemType
    #define ElemType int /* 数据元素类型默认为 int */
    #define ELEMTYPE_TAG
    #endif


    ///////////////////////////////////////////////////////////
    //链栈的存储结构定义
    typedef struct LNode {
    ElemType data;
    struct LNode *next;
    } LNode, *LinkList;

    typedef LinkList LinkStack; //链栈类型

    ///////////////////////////////////////////////////////////
    //链栈的基本操作声明

    //构造一个空栈S
    Status InitStack(LinkStack &S);
    //销毁栈S
    Status DestroyStack(LinkStack &S);
    //将栈S清空
    Status ClearStack(LinkStack &S);
    //若栈S为空返回TRUE,否则FALSE
    Status StackEmpty(LinkStack S);
    //返回栈S中的元素个数
    int StackLength(LinkStack S);
    //用e返回栈顶元素
    // 前提:栈S存在且不空
    Status GetTop(LinkStack S, ElemType &e);
    //元素e入栈S
    Status Push(LinkStack &S, ElemType e);
    //S出栈用e返回出栈元素
    // 前提:栈S存在且不空
    Status Pop(LinkStack &S, ElemType &e);

    ///////////////////////////////////////////////////////////
    //链栈的基本操作的实现

    //构造一个空栈S
    Status InitStack(LinkStack &S)
    { S=NULL;
    // TODO (#1#): 构造一个空栈S,不带头结点
    return OK;
    //-------------------------------------
    }

    //销毁栈S
    Status DestroyStack(LinkStack &S)
    {
    // TODO (#1#):销毁栈S,相当于清空栈
    return ERROR;
    //-------------------------------------
    }

    //将栈S清空
    Status ClearStack(LinkStack &S)
    { S=NULL;
    // TODO (#1#): 将栈S清空,释放所有结点
    return OK;
    //-------------------------------------
    }

    //若栈S为空返回TRUE,否则FALSE
    Status StackEmpty(LinkStack S)
    { if(S==NULL) return true;
    else return false;
    // TODO (#1#): 若栈S为空返回TRUE,否则FALSE
    //-------------------------------------
    }

    //返回栈S中的元素个数
    int StackLength(LinkStack S)
    { int i=0;
    LNode* p=S;
    while(p){
    p=p->next;
    i++;
    }
    // TODO (#1#): 返回栈S中的元素个数
    return i;
    //-------------------------------------
    }

    //用e返回栈顶元素
    // 前提:栈S存在且不空
    Status GetTop(LinkStack S, ElemType &e)
    { if(S==NULL) return ERROR;
    e=S->data;
    // TODO (#1#):若栈S不空,则用e返回栈顶元素
    return OK;
    //-------------------------------------
    }

    //元素e入栈S
    Status Push(LinkStack &S, ElemType e)
    { LNode* q=(LNode*)malloc(sizeof(LNode));
    q->data=e;
    q->next=S;
    S=q;
    // TODO (#1#): 插入元素e作为新的栈顶
    return OK;
    //-------------------------------------
    }

    //S出栈用e返回出栈元素
    // 前提:栈S存在且不空
    Status Pop(LinkStack &S, ElemType &e)
    { if(S==NULL) return ERROR;
    LNode* q=S;
    e=q->data;
    S=q->next ;
    free(q);
    // TODO (#1#):若栈S不空,则删除栈顶元素用e返回
    return OK;
    //-------------------------------------
    }


    #ifdef ELEMTYPE_TAG
    #undef ElemType
    #undef ELEMTYPE_TAG
    #endif

    #endif

  • 相关阅读:
    hdu4665 DFS
    hdu4665 DFS
    hdu4717 三分(散点的移动)
    POJ 2559 Largest Rectangle in a Histogram(单调栈) && 单调栈
    洛谷 P2347 砝码称重
    洛谷 P3009 [USACO11JAN]利润Profits
    洛谷 P2925 [USACO08DEC]干草出售Hay For Sale
    洛谷 P1616 疯狂的采药
    洛谷 P1086 花生采摘
    洛谷 P1048 采药
  • 原文地址:https://www.cnblogs.com/spsglz/p/7674137.html
Copyright © 2020-2023  润新知