数据结构15:栈(04)

60 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

双端栈

上一篇中,我们为大家初步介绍了双端栈区别于一般栈的特点和性质。在本篇中将为大家继续讲解双端栈的行为方法。

因为双端栈本质上是两个栈共享同一个数据空间,所以一个双端栈需要有两个出栈方法和两个入栈方法来对应它所有的两个栈。因此,我们就需要为两个栈分别设计出栈方法和入栈方法。

首先来研究出入栈方法,因为入栈操作是对栈本身来操作的,与我们常规的栈基本相同,入栈方法也大差不差,我们可以先使用常规栈的出栈和入栈方法。

public void pushBottom()    // 给栈底指针为0的栈入栈元素
{
    if(++this.top1 >= this.arr.length)
    {
        this.top1--;
        System.out.println("这个栈满了哦~");
        return;
    }
    this.arr[this.top1] = value;
}
public int popBottom()  // 给栈底指针为0的出栈元素
{
    if(this.top1 < this.bottom1)
    {
        System.out.println("从空栈里是取不出东西的~");
        return null;
    }
    return this.arr[this.top1--];
}
​
public void pushTop()   // 给栈底指针为length的栈入栈元素
{
    if(--this.top2 < 0)
    {
        this.top2++;
        System.out.println("这个栈满了哦~");
        return;
    }
    this.arr[this.top2] = value;
}
public int popTop() // 给栈底指针为length的栈出栈元素
{
    if(this.top2 > this.bottom2)
    {
        System.out.println("从空栈里是取不出东西的~");
        return null;
    }
    return this.arr[this.top2++];
}

但是很显然这两个入栈方法不够双端,出入栈方法我们需要考虑栈的状态,空栈很好判断,但要如何判断栈满呢?

所以我们在这来设计一个方法来判断栈中是否还存在空间可用于存储元素。所以我们的问题是,双端栈要如何判断栈满呢?

当栈顶指针无法移动时,也就是当栈顶指针的下一次移动位置为数组末位时,就说明栈满了。而双端栈有两个栈顶指针,所以为了互相保护数据,当栈顶指针的下一次移动位置为另一个栈顶指针时,就说明栈满了。

public boolean existVacancy()
{
    if(this.top2 - this.top1 == 1)
        return false;
    return true;
}

小结

本篇中我们为大家介绍和设计了双端栈的入栈和出栈方法。

天天学习,加速成长!

希望与各位一起变得越来越强!