经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
深入理解Java 栈数据结构
来源:cnblogs  作者:rainple  时间:2018/11/22 10:26:24  对本文有异议

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

  

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

 

  一、栈结构要素

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

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

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

  

  1. //存放数据
  2. private Object[] data;
  3. //数据量
  4. private int size;
  5. //栈顶
  6. private int top;
  7. //默认栈大小
  8. private static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
  9. //最大容量
  10. private int maxCapacity;

  

  二、压栈

  1. /**
  2. * 向栈中放数据
  3. * @param obj
  4. * @return
  5. */
  6. public boolean push(Object obj){
  7. if (size >= maxCapacity) return false;
  8. data[++top] = obj;
  9. size++;
  10. return true;
  11. }

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

  1. /**
  2. * 压栈,如果栈深度超出数组长度,将数组扩大1.5倍
  3. * @param obj
  4. * @return
  5. */
  6. public boolean push1(Object obj){
  7. if (size >= maxCapacity){
  8. maxCapacity = maxCapacity * 3 / 2;
  9. Object[] newStack = new Object[maxCapacity];
  10. System.arraycopy(data,0,newStack,0,size);
  11. Arrays.fill(data,null);
  12. data = newStack;
  13. }
  14. data[++top] = obj;
  15. size++;
  16. return true;
  17. }

 

  三、出栈

  1. /**
  2. * 从栈中弹出数据
  3. * @return
  4. */
  5. public Object pop(){
  6. if (size <= 0) return null;
  7. size--;
  8. Object old = data[top];
  9. data[top--] = null;
  10. return old;
  11. }

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

 

  四、查看栈顶

  1. /**
  2. * 查看数据
  3. */
  4. public Object peek(){
  5. if (isEmpty()) return null;
  6. return data[top];
  7. }

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

 

  五、清空栈

  1. /**
  2. * 清空栈数据
  3. */
  4. public void clear(){
  5. while (top > -1){
  6. data[top--] = null;
  7. }
  8. size = 0;
  9. }

 

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

  

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号