|
|
|
|
移动端

3.6.2 栈的实现

《数据结构与算法分析:Java语言描述(原书第3版)》第3章表、栈和队列,本章讨论最简单和最基本的三种数据结构。实际上, 每一个有意义的程序都将显式地至少使用一种这样的数据结构, 而栈则在程序中总是要被间接地用到, 不管我们在程序中是否做了声明。本节为大家介绍栈的实现。

作者:冯舜玺/陈越 译来源:机械工业出版社|2016-04-13 17:43

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


3.6.2 栈的实现

由于栈是一个表, 因此任何实现表的方法都能实现栈。显然, ArrayList和LinkedList都支持栈操作; 99%的时间它们都是最合理的选择。偶尔设计一种特殊目的的实现可能会更快(例如, 如果被放到栈上的项属于基本类型)。因为栈操作是常数时间操作, 所以, 除非在非常独特的环境下, 这是不可能产生任何明显的改进的。83对于这些特殊的时机, 我们将给出两个流行的实现方法, 一种方法使用链式结构, 而另一种方法则使用数组, 二者均简化了在ArrayList和LinkedList中的逻辑, 因此我们不提供代码。

栈的链表实现

栈的第一种实现方法是使用单链表。通过在表的顶端插入来实现push, 通过删除表顶端元素实现pop。top操作只是考查表顶端元素并返回它的值。有时pop操作和top操作合二为一。

栈的数组实现

另一种实现方法避免了链而且可能是更流行的解决方案。由于模仿ArrayList的add操作, 因此相应的实现方法非常简单。与每个栈相关联的操作是theArray和topOfStack, 对于空栈它是-1(这就是空栈初始化的做法)。为将某个元素x推入栈中, 我们使topOfStack增1然后置theArray[topOfStack]=x。为了弹出栈元素, 我们置返回值为theArray[topOfStack]然后使topOfStack减1。

注意, 这些操作不仅以常数时间运行, 而且是以非常快的常数时间运行。在某些机器上, 若在带有自增和自减寻址功能的寄存器上操作, 则(整数的)push和pop都可以写成一条机器指令。最现代化的计算机将栈操作作为它的指令系统的一部分, 这个事实强化了这样一种观念, 即栈很可能是在计算机科学中在数组之后的最基本的数据结构。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

安全模式:J2EE、Web服务和身份管理最佳实践与策

本书全面阐述Java应用安全的基本知识并介绍一种强大的结构化安全设计方法;介绍独立于厂商的安全架构;列出详细的评估核对表以及23种经过实...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊