Java提高篇(三一)-----Stack

时间:2022-08-28 16:23:23

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

Java提高篇(三一)-----Stack

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提高篇&lpar;三二&rpar;-----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. java&colon;POI导出excel

    POI是一个开源项目,专用于java平台上操作MS OFFICE,企业应用开发中可用它方便导出Excel. 下面是使用示例: 1.maven中先添加依赖项 <dependency> &lt ...

  2. 【解决】 新浪sae固定链接404 问题

    固定链接404 固定链接是一个很重要的内容,wordpress默认的链接很复杂,也不利于搜索引擎搜索.wordpress也提供修改固定链接的功能,在设置里面[固定链接]修改. 但是,使用新浪sae的小 ...

  3. sql 不同server間寫入數據

    select * from sys.servers sp_dropserver @server =N'' sp_dropserver '' ,'droplogins' EXEC master.dbo. ...

  4. Linux cat命令详解

    本文主要内容源自网络,参考资料如下: 华夏名网,linux cat命令详解,http://www.sudu.cn/info/html/edu/20070101/290711.html 命令格式:cat ...

  5. uva201 Squares

     Squares  A children's board game consists of a square array of dots that contains lines connecting ...

  6. C、C&plus;&plus;用指针引用的差异

    1:并引述之间的区别在概念的指针 参考是可变的别名.例如 int m; int &n=m; 引用作为一个别名.它在逻辑上不是独立的.它的存在具有依附性.所以引用必须在一開始就被初始化.并且其引 ...

  7. 开篇-我眼中的FPGA

    既然是开篇,那就来闲话叨一叨FPGA吧. 掰掰指头,结识FPGA估计有5年多.作为嵌入式工程师,每天的日常充斥着ARM.DSP.操作系统.通讯.总线等耳熟能详的词汇,徜徉其中不能自拔,而这其中,自觉最 ...

  8. Python 编程规范

    原文传送符:请点击

  9. 20181013xlVba年级报表拆分为班级报表

    '年级报表拆分为班级报表 Public Sub CreateClassReport() Application.DisplayAlerts = False Dim Wb As Workbook Dim ...

  10. Apche Kafka 的生与死 – failover 机制详解

    转自:http://www.cnblogs.com/fxjwind/p/4972244.html Kafka 作为 high throughput 的消息中间件,以其性能,简单和稳定性,成为当前实时流 ...