数据结构16:栈(05)

93 阅读1分钟

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

双端栈

上一篇中,我们根据双端栈的特点,设计出了判断双端栈是否还有元素位置的方法。在本篇中,将利用这一方法来优化双端栈。 首先设计双端栈的两个入栈方法。

public void pushBottom()  // 为栈底指针为0的栈入栈元素
{
    if(this.existVacancy() && ++this.top1 >= this.arr.length)
    {
        this.top1--;
        System.out.println("这个栈满了哦~");
        return;
    }
    this.arr[this.top1] = value;
}
public void pushTop()    // 为栈底指针为length的栈入栈元素
{
    if(this.existVacancy() && --this.top2 >= this.arr.length)
    {
        this.top2++;
        System.out.println("这个栈满了哦~");
        return;
    }
    this.arr[this.top2] = value;
}

这样在进行元素入栈之前,都先判断一次栈的状态,确认栈中是否还有位置来入栈元素。这样就能规避掉双端栈在入栈元素时,因为两边栈的栈顶指针移动导致互相覆盖元素的问题。

优化完入栈方法后,我们再来接着优化出栈方法。

public int popBottom()   // 从栈底指针为0的栈中取出元素
{
    if(this.top1 < this.bottom1)
    {
        System.out.println("你无法从一个空栈中取出元素");
        return null;
    }
    return this.arr[this.top1--];
}
public int popTop()   // 从栈底指针为0的栈中取出元素
{
    if(this.top2 > this.bottom2)
    {
        System.out.println("你无法从一个空栈中取出元素");
        return null;
    }
    return this.arr[this.top2++];
}

基于链式存储结构实现栈

相比于由顺序表实现的栈,链式存储结构实现的栈要更加灵活,栈的入栈不在受数组长度影响,对空间的利用率更高。而与顺序表栈不同的是,链表栈只需要记录头结点就可以完成入栈和出栈操作。

小结

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

天天学习,加速成长!

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