在Java中Stack类表示后进先出(LIFO)的对象堆栈。栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的。每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下:

Stack通过五个操作对Vector进行扩展,允许将向量视为堆栈。这个五个操作如下:

            操作                                           说明

empty()

测试堆栈是否为空。

peek()

查看堆栈顶部的对象,但不从堆栈中移除它。

pop()

移除堆栈顶部的对象,并作为此函数的值返回该对象。

push(E item)

把项压入堆栈顶部。

search(Object o)

返回对象在堆栈中的位置,以 1 为基数。

Stack继承Vector,他对Vector进行了简单的扩展:

public class Stack<E> extends Vector<E>

  Stack的实现非常简单,仅有一个构造方法,五个实现方法(从Vector继承而来的方法不算与其中),同时其实现的源码非常简单

/**
* 构造函数
*/
public Stack() {
}
</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">
* push函数:将元素存入栈顶
</span><span style="color: rgb(0,128,0)">*/</span>
<span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)"> E push(E item) {
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> 将元素存入栈顶。
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> addElement()的实现在Vector.java中</span>

addElement(item);

    </span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)"> item;
} </span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">
* pop函数:返回栈顶元素,并将其从栈中删除
</span><span style="color: rgb(0,128,0)">*/</span>
<span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">synchronized</span><span style="color: rgb(0,0,0)"> E pop() {
E obj;
</span><span style="color: rgb(0,0,255)">int</span> len =<span style="color: rgb(0,0,0)"> size(); obj </span>=<span style="color: rgb(0,0,0)"> peek();
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> 删除栈顶元素,removeElementAt()的实现在Vector.java中</span>
removeElementAt(len - 1<span style="color: rgb(0,0,0)">); </span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)"> obj;
} </span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">
* peek函数:返回栈顶元素,不执行删除操作
</span><span style="color: rgb(0,128,0)">*/</span>
<span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">synchronized</span><span style="color: rgb(0,0,0)"> E peek() {
</span><span style="color: rgb(0,0,255)">int</span> len =<span style="color: rgb(0,0,0)"> size(); </span><span style="color: rgb(0,0,255)">if</span> (len == 0<span style="color: rgb(0,0,0)">)
</span><span style="color: rgb(0,0,255)">throw</span> <span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)"> EmptyStackException();
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> 返回栈顶元素,elementAt()具体实现在Vector.java中</span>
<span style="color: rgb(0,0,255)">return</span> elementAt(len - 1<span style="color: rgb(0,0,0)">);
} </span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">
* 栈是否为空
</span><span style="color: rgb(0,128,0)">*/</span>
<span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">boolean</span><span style="color: rgb(0,0,0)"> empty() {
</span><span style="color: rgb(0,0,255)">return</span> size() == 0<span style="color: rgb(0,0,0)">;
} </span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">
* 查找“元素o”在栈中的位置:由栈底向栈顶方向数
</span><span style="color: rgb(0,128,0)">*/</span>
<span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">synchronized</span> <span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)"> search(Object o) {
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> 获取元素索引,elementAt()具体实现在Vector.java中</span>
<span style="color: rgb(0,0,255)">int</span> i =<span style="color: rgb(0,0,0)"> lastIndexOf(o); </span><span style="color: rgb(0,0,255)">if</span> (i &gt;= 0<span style="color: rgb(0,0,0)">) {
</span><span style="color: rgb(0,0,255)">return</span> size() -<span style="color: rgb(0,0,0)"> i;
}
</span><span style="color: rgb(0,0,255)">return</span> -1<span style="color: rgb(0,0,0)">;
}</span></pre>

Stack的源码很多都是基于Vector,所以这里不再累述,更多详情请参考:Java提高篇(二九)-----Vector

Java提高篇(三一)-----Stack的更多相关文章

  1. Java提高篇(三二)-----List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...

  2. Java提高篇(三二)-----List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点能够对List接口有了比較深的了解了.仅仅有通过归纳总结的知 ...

  3. Java提高篇——对象克隆(复制)

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  4. Java提高篇(三三)-----Map总结

    在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...

  5. java提高篇(三十)-----Iterator

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...

  6. java提高篇(二九)-----Vector

    在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...

  7. Java提高篇(二八)------TreeSet

    与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...

  8. Java提高篇(二七)-----TreeMap

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

  9. Java提高篇(二六)-----hashCode

          在前面三篇博文中LZ讲解了(HashMap.HashSet.HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最 ...

随机推荐

  1. C++ exe调用dll文件

    生成dll程序 extern "C"_declspec(dllexport) void maopao(int *p,int count);void maopao(int *p,in ...

  2. spring知识大全(3)

    4 Spring对持久层的支持 Spring对持久层的支持:① JDBC,② O/R Mapping(Hibernate,TopLink等) 一.Spring对持久层支持采用的策略: 1.Spring ...

  3. Windows结构化异常

    不错的总结: http://hi.baidu.com/wangxvfeng101/item/518f6efdab4e5616ff35820e http://www.vckbase.com/index. ...

  4. MFC - 微软基础类库和框架

    一 MFC的概念和作用 1 什么是MFC?? 全称 Microsoft Foundation Class Library我们称之为微软基础类库 1)从硬盘的存在形式上来说 MFC就是一个库(静/动态库 ...

  5. 陨石坑之webapi使用filter

    首先为什么说这是一个坑,是因为我们在webapi中使用filter的时候也许会先百度一下,好吧,挖坑的来了,我看了好几篇文章写的是使用System.Web.Mvc.Filters.ActionFilt ...

  6. Hibernate+jsp+struts+spring做增删该查,

    同样还是web项目,这里只做了一张表,做一个测试,例子.主要是建Hibernate 的时候要非常注意,有时间了整理一下建Hiberbnate 的时候需要注意的事项 这里我是建了5个包,其实只要四个就好 ...

  7. js中的定义

    执行环境:执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为,每个执行环境都有一个与之关联的 变量对象:环境中定义的所有变量和函数都保存在这个对象中.(在函数中这个变量对象叫活动对象) ...

  8. apache安装mod_deflate配置支持gzip

    apache 配置支持gzip apache使用gzip压缩能够大幅提高网站访问速度并节省网络流量,在网页响应头信息中可以判断是否支持压缩. HTTP/1.1 200 OK Date: Wed, 14 ...

  9. VMware克隆虚拟机,克隆机网卡启动不了解决方案

    Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interfac ...

  10. Python排列组合问题

    1.字符串的全排列 问题描述:打印出原字符串中所有字符的所有排列.——将输入字符串中的每个字符作为一个不同的字符看待,即使它们是重复的,如'aaa'应打印6次. Python可以用生成器解决: def ...