持续创作,加速成长!这是我参与「掘金日新计划 · 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++];
}
基于链式存储结构实现栈
相比于由顺序表实现的栈,链式存储结构实现的栈要更加灵活,栈的入栈不在受数组长度影响,对空间的利用率更高。而与顺序表栈不同的是,链表栈只需要记录头结点就可以完成入栈和出栈操作。
小结
本篇中我们为大家设计和优化了双端栈的入栈方法。
天天学习,加速成长!
希望与各位一起变得越来越强!