• 栈和队列总结


    栈和队列都来自线性表数据结构,都是“操作受限”的线性表

                               

    1.定义是限制在表的一端进行插入和删除操作的线性表。后进先出LIFO线性表

     

    2. 注意点

    栈顶(Top):允许进行插入、删除操作的一端,又称为表尾。用栈顶指针(top)来指示栈顶元素。

    栈底(Base):是固定端,又称为表头

                               ——顺序存储

    定义栈的顺序存储结构,用一维数组来存储栈。根据数组是否可以根据需要增大,又可分为静态顺序栈动态顺序栈

                               ——动态顺序存储

    1. 注意点

     ◆ top=bottom作为栈空的标记

     ◆ 结点进栈时,首先将数据元素保存到栈顶(top所指的当前位置),然后执行top1,使top指向栈顶的下一个存储位置

     

     ◆ 结点出栈时,首先执行top1,使top指向栈顶元素的存储位置,然后将栈顶元素取出

     ◆ 若栈的数组有Maxsize个元素,则top=Maxsize栈满

    2. 结构体定义

    typedef struct SqStack
    {   ElemType  *bottom;     /*  栈不存在时值为NULL  */
        ElemType  *top;      /*  栈顶指针  */
        int stacksize ;      /*  当前已分配空间,以元素为单位  */
    }SqStack;

    3. 追加存储空间操作

    // 在压栈操作中
    if(S.top-S.bottom>=S. stacksize-1){
        //  栈满,根据存储空间增量,追加存储空间 
        S.bottom=(ElemType *)realloc((S.STACKINCREMENT+STACK_SIZE) *sizeof(ElemType));   
        if ( !S.bottom)  
            return  ERROR; 
        // 存储空间追增后,栈顶指针的位置
        S.top=S.bottom + S. stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    // 空间追赠完毕后,对于压栈操作,直接赋值元素到 S.top 即可  
    *S.top=e;
    S.top++; 

                               ——静态顺序存储

    1. 注意点

     ◆ top=0表示栈空,每次top指向栈顶在数组中的存储位置

     ◆ 结点进栈时,首先执行top1,使top指向新的栈顶位置,然后将数据元素保存到栈顶(top所指的当前位置)

     ◆ 结点出栈时,首先把top指向的栈顶元素取出,然后执行top1,使top指向新的栈顶位置。

     

     ◆ 若栈的数组有Maxsize个元素,则top=Maxsize-1栈满

    2.结构体定义

    typedef struct SqStack{  
        ElemType stack_array[MAX_STACK_SIZE] ;
        int top,bottom;
    }SqStack;

    3. 上下溢:

    栈满时做进栈,定产生溢出,简称上溢” —— 上溢是一种出错状态

    栈空时做退栈,将产生溢出,简称下溢” —— 下溢可能是正常现象

                               ——链序存储

    1. 定义链式存储结构称为链栈,是运算受限的单链表。其插入和删除操作只能在表头位置上进行。因此,链栈没有必要像单链表那样附加头结点,栈顶指针top就是链表的头指针

     

    2. 注意点

    ◆ top == NULL

    top 所指,即栈顶元素

    3. 栈的应用

    ◆ 进值转换

    ◆ 括号匹配

    ◆ 递归调用:

    1)有效的递归调用函数应包括两部分:递推规则  终止条件

    2)递归:一个函数直接或间接地调用自己本身

                               队列

    1.定义队列是运算受限的线性表。是一种先进先出FIFO的线性表。只允许在表的一端进行插入,而在另一端进行删除。

    ① 队首(front) :允许进行删除的一端称为队首。

    ② 队尾(rear) :允许进行插入的一端称为队尾

                               队列——顺序存储结构

    1. 定义利用一组连续的存储单元(一维数组) 依次存放从队首到队尾的各个元素,称为顺序队列

    2. 结构体定义

    typedef  struct  queue{      
        ElemType   Queue_array[MAX_QUEUE_SIZE];
        int  front;
        int  rear;
    }SqQueue;

    3. 注意点

    ◆ 初始化:front=rear=0入队:将新元素插入rear所指的位置,然后rear1

    出队:删去front所指的元素,然后加1并返回被删元素。队空front=rear。◆ 队满rear=MAX_QUEUE_SIZE-1front=rear

     

    4. 假溢出

    在入队和出队操作中,头、尾指针只增加不减小,致使被删除元素的空间永远无法重新利用

                               循环队列

    1.避免“假溢出”思想:

    当队首、队尾指针指向上界(MAX_QUEUE_SIZE-1)时,其加1操作的结果是指向向量的下界0

    2. 用模运算简化操作:

    i=(i+1)%MAX_QUEUE_SIZE

    ◆ i代表队首 (front)或队尾 (rear)

    3. 注意点

    rear所指的单元始终为空

    ◆ 循环队列front=rear 

    ◆ 循环队列(rear+1)%MAX_QUEUE_SIZE =front

    入队:先赋值,再队尾指针移动rear=(rear+1)% MAX_QUEUE_SIZE

    出队:先值,再队首指针移动 front=(front+1)% MAX_QUEUE_SIZE

                               队列——链序存储结构

    1.定义链队列,是限制仅在表头进行删除操作和表尾进行插入操作的单链表

    2.结构体定义:

    1)数据元素结点:

    typedef struct Qnode{  
        ElemType    data;
        struct Qnode  *next;
    }QNode;

    2)指针结点:

    typedef struct link_queue{   
        QNode  *front ,  *rear;
    }Link_Queue;

     

     

  • 相关阅读:
    170516、ActiveMQ 的安装与使用(单节点)
    170515、mybatis批量操作
    170512、java日志文件log4j.properties配置详解
    170511、Spring IOC和AOP 原理彻底搞懂
    170510、数据库默认隔离级别
    170509、文本编辑器编写的shell脚本在linux下无法执行的解决方法
    170508、忘记jenkins密码或者修改jenkins密码
    170505、MySQL的or/in/union与索引优化
    170504、MongoDB和MySQL对比(译)
    Jenkins Android 打包
  • 原文地址:https://www.cnblogs.com/expedition/p/12199387.html
Copyright © 2020-2023  润新知