Stack源码解析

Stack介绍:

  堆栈(Stack)是一个元素序列。盾战中唯一能被删除、访问或修改的元素是最近插入的元素。这个元素就是位于堆栈顶部的那个元素。

  举例来说,自助餐厅的盘子架就是一个由盘子构成的堆栈。增加和移除操作只能在顶部进行。为了把它重新摆放,刚刚放到架子上的盘子将在下一次被移动。这种堆栈属性的定义有时简称为“后进先出”,或者LIFO。和这种观点相对应,我们把插入称为压栈(push),删除称为弹栈(pop)。为了逗以p字母开头,我们把得到栈顶元素的操作称为浏览(peek)。

  public class Stack<E> extends Vector<E>;Stack类集成Vector,为了提高效率Stack对象的栈顶元素位于数组的size()-1索引位置,栈底位于索引0.Stack类的这种实现的致命缺点是:它并不禁止Vector类的任何方法,因此在一个Stack对象的任何位置插入、删除都是合法的。想象下面这种情况:在Stack类中,调用了违反堆栈定义的方法居然是合法的!您也许会说这种实现有点过了头。

Stack源码解析:

  

 1 package list.Stack;
 2
 3 import java.util.EmptyStackException;
 4 import java.util.Vector;
 5
 6 public class Stack<E> extends Vector<E> {
 7     /**
 8      * 创建一个新的Stack.
 9      */
10     public Stack() {
11     }
12
13     // 在栈顶,也及时数组的末尾添加元素
14     public E push(E item) {
15         addElement(item);
16
17         return item;
18     }
19
20     //删除栈顶的元素,并返回该元素
21     public synchronized E pop() {
22         E obj;
23         int len = size();
24         obj = peek();
25         removeElementAt(len - 1);
26         return obj;
27     }
28
29     //浏览栈顶的元素
30     public synchronized E peek() {
31         int len = size();
32
33         if (len == 0)
34             throw new EmptyStackException();
35         return elementAt(len - 1);
36     }
37
38     //判断堆栈中元素的数量是否为0
39     public boolean empty() {
40         return size() == 0;
41     }
42
43     //判断堆栈中是否含有某个元素
44     public synchronized int search(Object o) {
45         int i = lastIndexOf(o);
46
47         if (i >= 0) {
48             return size() - i;
49         }
50         return -1;
51     }
52
53     private static final long serialVersionUID = 1224463164541339165L;
54 }

总结

(01) Stack实际上也是通过数组去实现的。
       执行push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。
       执行peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。
       执行pop时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。
(02) Stack继承于Vector,意味着Vector拥有的属性和功能,Stack都拥有。而且其实现压栈(push),弹栈(pop)等操作也是调用了Vector类中的方法。

Stack示例:

 1 package list.vector;
 2
 3 import java.util.Stack;
 4
 5 public class VectorDemo {
 6     public static void main(String[] args) {
 7         Stack<String> strs = new Stack<String>();
 8         //将0~9添加到堆栈中
 9         for (int i = 0; i < 10; i++) {
10             strs.push(i+"");
11         }
12         //遍历堆栈
13          //for循环快速遍历
14         for (int i = 0; i < strs.size(); i++) {
15             System.out.print(strs.get(i));
16         }
17         System.out.println();
18         System.out.println("------1-----" );
19         //栈弹出遍历方式
20 //        while (s.peek()!=null) {     //不健壮的判断方式,容易抛异常,正确写法是下面的
21         while (!strs.empty()) {
22                 System.out.print(strs.pop());
23         }
24         System.out.println();
25         System.out.println("------2-----" );
26     }
27 }

运行结果:

0123456789
------1-----
9876543210
------2-----

写在最后:
  此篇随笔仅用来记录我的学习内容,如有错误,欢迎指正。谢谢!!!

时间: 2024-11-09 03:06:59

Stack源码解析的相关文章

【源码】Vector、Stack源码解析

注:以下源码基于jdk1.7.0_11 Vector算是一个历史遗留下来的类,现在已基本被ArrayList取代.本文出于学习的目的来分析下这个类. 从图上可以看出Vector和ArrayList同样都直接继承于AbstractList,说明这两者功能上还是很相像的,事实也正是如此. 下面我们依然通过源码的方式解读Vector这个类. public class Vector<E> extends AbstractList<E> implements List<E>, R

Java 集合系列 06 Stack详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列 05 Vector详细介绍(源码解析)和使用示例 Java 集合系列 06 Stack详细介绍(源码解析)和使用示例 第1部分 Stack介绍 Stack简介 Stack是栈.它的特性是:先进后出(FILO, F

【转】 Java 集合系列07之 Stack详细介绍(源码解析)和使用示例

概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.内容包括:第1部分 Stack介绍第2部分 Stack源码解析(基于JDK1.6.0_45)第3部分 Vector示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308852.html 第1部分 Stack介绍 Stack简介 Stack是栈.它的

(转)Java 集合系列07之 Stack详细介绍(源码解析)和使用示例

概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.内容包括:第1部分 Stack介绍第2部分 Stack源码解析(基于JDK1.6.0_45)第3部分 Vector示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308852.html 第1部分 Stack介绍 Stack简介 Stack是栈.它的

Java 集合系列07之 Stack详细介绍(源码解析)和使用示例

http://www.cnblogs.com/skywang12345/p/3308852.html 概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.内容包括:第1部分 Stack介绍第2部分 Stack源码解析(基于JDK1.6.0_45)第3部分 Vector示例 转载请注明出处:http://www.cnblogs.com/skywang1

Java Stack源码分析

Stack简介 Stack是栈.它的特性是:先进后出(FILO, First In Last Out).java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表.当然,我们也可以将LinkedList当作栈来使用.Stack的继承关系 java.lang.Object ? java.util.AbstractCollection<E> ? java.util.AbstractList<E>

给jdk写注释系列之jdk1.6容器(10)-Stack&amp;Vector源码解析

前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈. 什么是栈呢,我就不找它具体的定义了,直接举个例子,栈就相当于一个很窄的木桶,我们往木桶里放东西,往外拿东西时会发现,我们最开始放的东西在最底部,最先拿出来的是刚刚放进去的.所以,栈就是这么一种先进后出( First In Last Out,或者叫后进先出) 的容器,它只有一个口,在这个口放入元素,也在这个口取出元素. 栈最主要了两个动作就是入栈和出栈操作,其实还是很容易的明白的对不

Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

概要  前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数据结构第3部分 LinkedList源码解析(基于JDK1.6.0_45)第4部分 LinkedList遍历方式第5部分 LinkedL

Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 概要  和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数