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

本文详细介绍了栈的顺序存储结构,包括栈的定义、接口定义及实现。重点讨论了顺序栈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()方法
    继续分为左右两个部分,若左端为空,则输出左端为空,否则则开始遍历,右端同样的操作
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值