数据结构与算法---动态数组(2)顺序栈ArrayStack、双端栈ArrayStackDoubleEnd

  1. 栈的顺序存储结构
    a.栈的定义:栈是限定仅在表尾进行插入和删除操作的线性表
    在这里插入图片描述我们把允许插入和删除的一端称为栈顶,另一端称为栈底
    栈又称为后进先出的线性表
    定义中说的时在线性表的表尾进行插入和删除,这里表尾是栈顶
    栈的插入操作,叫做进栈,也称压栈,入栈
    栈的删除操作,叫做出栈,也称弹栈
    b.栈的接口定义
    在这里插入图片描述成员变量,成员函数
    我们可以将顺序表看成时栈的一个成员变量
    在这里插入图片描述c.接口的实现
    接口的实现我们都可以基于顺序表来实现,直接调用顺序表的方法
    在这里插入图片描述在这里插入图片描述
  2. 双端栈的顺序存储结构
    是指将一个线性表的两端当作栈底分别经行入栈和出栈操作
    在这里插入图片描述在这里插入图片描述双端栈的内部变量
    在这里插入图片描述
    因为双端栈需要在两端都可以进行操作,所以简单的顺序表就已经不能实现它了,我们则需要重写他的底层实现
    成员变量
    在这里插入图片描述成员函数
    在这里插入图片描述获取栈中所有有效元素的个数
    1.当前栈分为左右两个部分,我们想要获取栈中全部的有效个数,则需要分别获取左右两边的有效元素个数
    2.左边有效元素个数就是栈底位置+1(lefttop+1)
    3.右边有效元素个数为数组的长度-右端顶的位置(data.length-righttop)
    3.将左右两个有效元素个数相加,则为栈中所有有效元素的个数
    在这里插入图片描述判断栈是否为空
    我们继续将他从左右两边分开判断
    1.判断左栈是否为空 lefttop=-1;
    2.判断右栈是否为空righttop=data.length;
    3.如果左右两边同时为空,则栈为空,否则就不为空
    在这里插入图片描述元素e进栈
    依旧分为左右两边进栈
    1.左边进栈,首先判断左栈是否为满(lefttop+1=righttop),若为满则需扩容,然后将元素放入,若不满,则直接lefttop+1处放元素e
    2.右边进栈,判断右栈是否满了(righttop-1=lefttop),若为满则需扩容,然后将元素放入,若不满,则直接righttop-1处放元素e
    3.判断左栈和右栈元素的个数,那边少就往那边进
    在这里插入图片描述扩容
    在这里插入图片描述在这里插入图片描述1.先创建一个新数组,然后开始赋值
    2.左边的lefttop位置不变,所以继续遍历它
    3.右边我们则需要遍历,右边有效元素次,然后将他赋给新数组
    在这里插入图片描述弹栈
    依旧是分为左右两边
    1.判断左边是否为空,若为空则提示,若不为空则返回data[leftTop–]
    2.判断右边是否为空,若为空则提示,若不为空则返回data[rightTop++]
    3.总的弹栈,谁多谁出,但是要考虑缩容,所以先将值赋给一个变量,然后缩容(当前长度小于等于长度的四分之一并且缩后的长度大于10),最后返回变量。
    在这里插入图片描述
    缩容
    在这里插入图片描述1.放入新数组后左边的lefttop依旧不变,所以将原来左边的元素放入新数组
    2.右边的元素则需要从原来的righttop开始,到data.length,将原来位置的元素i,放入到新数组中的i-newData.length的位置
    3.同时righttop=righttop-newdata.length
    在这里插入图片描述查看栈顶元素和清空栈
    在这里插入图片描述重写
    和线性表一样,调用StringBuilder,StingFormart,append()方法
    继续分为左右两个部分,若左端为空,则输出左端为空,否则则开始遍历,右端同样的操作
    在这里插入图片描述
发布了22 篇原创文章 · 获赞 3 · 访问量 341

猜你喜欢

转载自blog.csdn.net/qq_45161607/article/details/103478619
今日推荐