我们为什么要使用堆栈,因为数组或链表可以完成堆栈可以执行的所有操作

时间:2014-10-24 04:53:21

标签: arrays data-structures linked-list stack

我想知道为什么我们甚至应该使用堆栈,因为数组或链表可以完成堆栈可以做的所有事情?为什么我们要把它命名为"数据结构"分别?在现实世界中,只需使用一个阵列即可足以解决问题;为什么有人会费心去实现一个限制自己只能从集合顶部推送和弹出的堆栈呢?

2 个答案:

答案 0 :(得分:1)

堆栈可以并且通常使用数组或链表作为底层结构来实现。使用Stack有很多好处。

其中一个主要好处是由推/弹操作维护的LIFO订购。这允许堆栈元素具有自然顺序并且以与它们的添加顺序相反的顺序从堆栈中移除。这种数据结构在许多应用中非常有用,其中仅使用数组或链表实际上效率较低和/或更复杂。其中一些应用程序是:

  • 符号平衡(例如括号)
  • 中缀到后缀转换
  • 后缀表达式的评估
  • 实现函数调用(包括递归)
  • 寻找跨度(在股市中寻找跨度)
  • 浏览网页中的网页访问历史记录(后退按钮)
  • 在文本编辑器中撤消序列
  • 匹配HTML和XML中的标签

Here are some more stack applications

And some more...

数组或链表的两个底层实现为堆栈提供了不同的功能和特性。这是一个简单的比较:

(动态)数组实施:

1. All operations take constant time besides push().
2. Expensive doubling operation every once in a while.
3. Any sequence of n operations (starting from empty stack) -> "amortized" bound takes time proportional to n.

链接列表实施:

1. Grows and shrinks easily.
2. Every operation takes constant time O(1).
3. Every operation uses extra space and time to deal with references.

答案 1 :(得分:1)

我认为最好使用术语数据类型来引用行为由某些接口,代数或操作集合定义的事物。像

这样的事情
  • 队列
  • 优先队列
  • 出队
  • 列表
  • 层次结构
  • 地图(字典)

是类型,因为对于每个类型,我们只列出他们的行为。堆栈是堆栈,因为它们只能被推送和弹出。队列是队列,因为......(你得到了图片)。

另一方面,数据结构是由其排列组件的方式定义的数据类型的实现。例子包括

  • 数组(按索引进行常量时间访问)
  • 链表
  • 位图
  • BSTS
  • 红黑树
  • (a,b)-trees(例如2-3棵树)
  • 跳过列表
  • 哈希表(多种变体)
  • 邻接矩阵
  • 布隆过滤器
  • 朱迪阵列
  • 尝试次数

很多人确实混淆了术语数据结构和数据类型,但最好不要过于迂腐。堆栈是数据类型,而不是数据结构,但同样,为什么太迂腐。

为了回答您的具体问题,我们在我们想要确保或仅通过推送和弹出来修改数据的情况下使用堆栈作为数据类型,并且我们从不违反此访问模式(即使是偶然的)。

我们可以使用链表作为堆栈的实现。但是大多数编程语言都会提供一种限制接口的方法,以允许我们的代码以LIFO方式可读,安全地使用我们的数据。

TL; DR:可读性。安全