• 栈和队列



    阅读目录

    一、栈

    二、队列

    一、栈

    1.栈的定义

    栈是限定仅在表尾进行插入或删除操作的线性表。因此对栈来说,表尾端有其特殊含义,称栈顶,相应的表头端称为栈底。栈又称为后进先出(LIFO)线性表。

    2.基本操作

    InitStack(&S)                 //构造一个空栈S
    DestroyStack(&S)              //栈S被销毁
    ClearStack(&S)                //将S清为空栈
    StackLength(S)                //返回S的元素个数,即栈的长度
    GetTop(S,&e)                  //用e返回S的栈顶元素
    Push(&S,e)                    //插入元素e为新的栈顶元素
    Pop(&S,&e)                    //删除S的栈顶元素,并用e返回其值
    StackTraverse(S,visit())      //从栈底到栈顶依次对S的每个数据元素调用visit()。一旦visit()失败,则操作失败。
    

    3.栈的表示和实现

    3.1顺序栈

    3.1.1定义

    顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。

    3.1.2实现
    #define MaxSize 50
    typedef struct{
        ElemType   data[MaxSize]
        int top;
    }SqStack;
    
    3.1.3基础操作
    //初始化空栈
    void InitStack(SqStack &s){
        s.top = -1;
    }
    
    //判断空栈
    bool StackEmpty(SqStack S){
        if(S.top == -1)
            return true;
        else
            return false;
    }
    
    //进栈
    bool Push(SqStack &S, ElemType x){
        if(S.top == Maxsize-1){
            return false;
        }
        S.data[++S.top] = x;
        return true;
    }
    
    //出栈
    bool Pop(SqStack &S, ElemType &x){
        if(S.top == -1){
            return false;
        }
        x = S.data[S.top--];
        return true;
    }
    
    //读取栈顶元素
    bool GetTop(SqStack S, ElemType &x){
        if(S.top == -1){
            return false;
        }
        x = S.data[S.top];
        return true;
    }
    

    3.2共享栈

    3.2.1定义

    将两个栈底设置在共享空间的两端,栈顶想空间中延伸。
    优点:存取时间复杂度任为O(1),但空间利用更加有效

    3.2.2基础操作
    //判空条件
    1号栈top == -1
    2号栈top == MaxSize
    
    //栈满
    top2-top1 == 1
    

    3.3链式栈

    3.3.1定义

    采用链式存储的栈

    3.3.2实现
    typedef struct LinkNode{
        ElemType data;
        struct LinkNode *next;
    }*LiStack;
    
    //所有的操作都在表头进行
    

    二、队列

    1.队列的定义

    和栈相反,队列是一种先进先出(FIFO)的线性表。它只允许在表的一端插(队尾)入,另一端(队头)删除。

    2.基本操作

    InitQueue(&Q)           //构造一个空队列Q
    DestroyQueue(&Q)        //销毁队列Q
    ClearQueue(&Q)          //将Q清为空队列
    QueueEmpty(Q)           //若Q为空队列,则返回TRUE,否则返回FALSE
    QueueLength(Q)          //返回Q的元素个数,即队列的长度
    GetHead(Q, &e)          //用e返回Q的队头元素
    EnQueue(&Q,e)           //插入元素e为Q的新的队尾元素
    DeQueue(&Q,&e)          //删除Q的队头元素,并用e返回其值
    
  • 相关阅读:
    【后缀数组】poj2406 Power Strings
    [HNOI 2013]游走
    [HAOI 2008]木棍分割
    [SCOI 2010]传送带
    [SDOI 2010]魔法猪学院
    [Codeforces 235B]Let's Play Osu!
    [SPOJ 10628]Count on a tree
    [ZJOI 2010]count 数字计数
    [SHOI 2008]Debt 循环的债务
    [JSOI 2008]星球大战starwar
  • 原文地址:https://www.cnblogs.com/zhangliang91/p/12008492.html
Copyright © 2020-2023  润新知