手写Java 栈结构以及简单的介绍栈的应用场景

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

image

从上图是基于数组实现的栈,可以看到,对栈的操作(压栈、出栈)其实都是对栈顶元素的操作,因此压栈和出栈的速度都比较快。栈中元素按照FILO顺序排序的,即先入后出的规则,先放进去的元素最后才能被弹出来。

一、栈结构要素

1、栈,是用来存储数据的数据结构,可以使用数组或链表来实现栈结构

2、栈顶,顾名思义栈最顶部的元素,压栈与出栈的对象

3、栈深度,栈中数据多少,如果栈结构为数组,当栈长度大于等于数组长度后,会抛出异常或对数组进行扩容,栈结构是链表就没有这个限制。

    //存放数据
    private Object[] data; //数据量
    private int size; //栈顶
    private int top; //默认栈大小
    private static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //最大容量
    private int maxCapacity;

二、压栈

   /**
     * 向栈中放数据
     * @param obj
     * @return */
    public boolean push(Object obj){ 
        if (size >= maxCapacity) 
            return false;
        data[++top] = obj;
        size++; return true;
    }

压栈操作比较简单,将新元素放在原栈顶的上面,栈顶指针往上移动一位。我这里当栈深度等于数组长度后是直接返回false的,当然根据实际的需求,你也可以对现有数组进行扩容,然后将原栈中元素放入新栈中即可。如:

     /**
     * 压栈,如果栈深度超出数组长度,将数组扩大1.5倍
     * @param obj
     * @return */
    public boolean push1(Object obj){ 
        if (size >= maxCapacity){
            maxCapacity = maxCapacity * 3 / 2;
            Object[] newStack = new Object[maxCapacity];
            System.arraycopy(data,0,newStack,0,size);
            Arrays.fill(data,null);
            data = newStack;
        }
        data[++top] = obj;
        size++; return true;
    }

三、出栈

   /**
     * 从栈中弹出数据
     * @return */
    public Object pop(){
        if (size <= 0) 
            return null;
        size--;
        Object old = data[top];
        data[top--] = null; return old;
    }

出栈操作将栈顶元素掷为null,然后将栈顶指针往下移动一位即可,很简单。

四、查看栈顶

    /**
     * 查看数据 */
    public Object peek(){ 
          if (isEmpty()) 
              return null;
          return data[top];
    }

这个方法更是简单,只是查看栈顶元素,并没有将栈顶元素删除。

五、清空栈

    /**
     * 清空栈数据 */
    public void clear(){
        while (top > -1){
            data[top--] = null;
        }
        size = 0;
    }

栈数据结构的实现基本已经讲完了,栈的基本操作差不多包包含在里面了,代码实现起来就是这么简单。另外,另一种基于链表的栈我就不再这里说了,因为也是很简单的,这是栈限定对链表的操作只能是操作链表头部,大家如果感兴趣的话可以自己尝试用链表实现一个栈,或者可以参考一下我之前写的基于链表实现的队列,原理是差不多的,也可以参考一下jdk中的LinkedList。

应用场景

1.函数的调用,比如Java中方法的调用就是方法的入栈和出栈的操作。
2.使用栈实现计算器的功能,这个我在后续的文章中会有写到。
3.网页浏览记录。因为栈先进后出的特性,所以每次打开网页时就把当前的网页压入栈中,后退时先出栈,然后跳页面。
4.栈数据结构哟非常多的应用场景,这里只是列举其中一二。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 栈结构 栈也是一种非常常见的数据结构, 并且在程序中的应用非常广泛. 一. 认识栈结构 我们先来简单认识一下栈结构...
    小码哥教育520it阅读 1,972评论 0 1
  • 如需转载, 请咨询作者, 并且注明出处.有任何问题, 可以关注我的微博: coderwhy, 或者添加我的微信: ...
    coderwhy阅读 20,147评论 5 49
  • 堆简介 堆是一种常用的树形结构,是一种特殊的完全二叉树,当且仅当满足所有节点的值总是不大于或不小于其父节点的值的完...
    游戏创作者阅读 757评论 0 1
  • 认识栈结构   我们先来回顾一下数组结构,我们知道数组是一种线性结构,并且可以在数组的任意位置插入和删除,但是有时...
    凉寻阅读 386评论 0 0
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    余生动听阅读 10,811评论 0 11

友情链接更多精彩内容