在之前的文章中详细介绍过队列这种数据结构,队列是一种先入先出(FIFO)的线性表。和队列相反,今天要讲的栈(stack)是一种先入后出(first in last out,FILO)的线性表。举一个生活中的例子,我们平时放盘子的时候是从上往下一个一个的放,取的时候我们也是从上往下一个一个的取,不能从中间任意取出。

栈是一种操作受限的线性表,只能在一端进行插入和删除数据。允许插入和删除的一端为变化的一端,称为栈顶(top),另一端为固定的一端,称为栈底(bottom)。最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素在栈顶最先删除,最先放入的元素在顶底最后删除。

后进者先出,先进者后出,这就是栈结构。

为什么要使用栈

从上面描述看,栈这种数据结构只有入栈和出栈操作,带给我们的只有限制,相对于数组和链表并没有任何优势。我们直接使用数组或链表就好了,为什么还要用这种操作受限的栈呢?从使用上来讲,我们确实可以使用数组或链表来替代栈。有句话说的好,存在即合理,特定的数据结构是对特定问题的抽象,就是因为数组和链表提供了太多的操作方法,使用时就带来了不可控,也就更容易出错。减少bug的方式就是少写代码。

当只涉及在一端插入和删除数据,并且满足先进后出的特性时,我们就应该优先选择使用栈这种数据结构。

栈的基本操作

栈(stack)主要包含两个操作入栈和出栈。入栈(push)从栈顶插入元素的操作,出栈(pop)删除栈顶元素的操作。

用数组实现的栈称为顺序栈,用链表实现的栈称为链式栈。本篇文章将用数组来实现栈,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时使用指针top指向栈顶元素在栈中的位置,top = 0 表示空栈。

空栈

顺序栈在Java中的表示

public class ArrayStack {

    private Integer[] items;

    private final int stackSize;

    private int top;

    public ArrayStack(int stackSize) {
        this.stackSize = stackSize;
        items = new Integer[stackSize];
    }
}

stackSize 表示栈可用的最大容量,top为栈顶指针,初始值为0。当插入一个新的元素时,栈顶指针top增1,删除栈顶元素时,指针top减1,因此,栈顶指针top始终在栈顶元素的下一个位置。

如下图所示,元素a,b,c,d 4个元素依次入栈过程示意图:

入栈

入栈操作

public boolean push(Integer item) {
    if(top == stackSize) {
        System.out.println("栈已满");
        return false;
    }
    items[top++] = item;

    return true;
}

出栈操作

public Integer pop() {
    if(top == 0) {
        System.out.println("栈为空");
        return null;
    }
    return items[--top];
}

入栈和出栈只涉及栈顶指针的操作,时间复杂度为O(1)。

栈的应用:表达式求值

假如要对下面的算术表达式求值:

4 + 2 * 3 - 10/5

对于这种简单的算术四则运算,我们用肉眼看一下,大脑很快就能求解出答案,但是对于计算机来说理解这个表达式就没那么容易了,如果让你来实现这样一个表达式求值的功能,你会怎么来实现呢?大家可以先思考下使用本文介绍的栈结构如何来实现,下篇文章我讲给出具体的实现过程,敬请期待。

「更多精彩内容请关注公众号geekymv,喜欢请分享给更多的朋友哦」
geekymv

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值