使用列表等其他数据结构实现Stack

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用列表等其他数据结构实现Stack相关的知识,希望对你有一定的参考价值。

我已经在许多语言中看到基本上实现堆栈,他们借助其他数据结构。例如:如果我们需要在python中实现堆栈,我们无法利用列表。一个非常简单的例子

class Stack(object):


def __init__(self):
    self.stack = []

def isEmpty(self):
    return self.stack == []

def push(self, element):
    self.stack.append(element)

def pop(self):
    return self.stack.pop()

def peek(self):
    return self.stack[len(self.stack) - 1]

def size(self):    
    return len(self.stack)

点是这样做甚至有意义吗?如果是的话怎么样?

答案

在python中,除非你真的想要练习,否则实现自己的堆栈没有任何意义。您可以使用列表,即使没有包装类,也可以使用集合中的deque类。 Deque是堆栈和队列的通用数据结构:

Collections deque

另一答案

与任何其他ADT一样,实现数据结构(例如堆栈)的要点是:

  • 提供具有众所周知的操作的简单API。
  • 隐藏结构的实现细节。

有时你从中得到的第二个后果是结构更容易使用;确定没有人愿意每次必须访问时手动管理基于数组的二进制堆的元素,但这不是提供该类型的主要点。在堆栈的情况下,实现它是非常简单的,所以从这个意义上说你不会赢得任何东西。那你得到的是什么?

提供具有众所周知的操作的简单API

我认为这仍然不是最重要的方面,但如果你想使用堆栈,使用堆栈操作(push,pop)比列表操作更清晰。具体来说,最好的是有一个有限的接口,不允许你调用禁止的操作,和/或提供比更通用的方法更好的错误和角落情况行为。

隐藏结构的实现细节

这是关键点。所有这一切中最重要的是你不需要(也不可能)知道数据结构是如何实现的,允许你稍后改变实现。假设您现在希望将堆栈保留到磁盘;每次推或弹时都需要添加文件读写操作。现在假设您希望此存储在多台计算机之间分配。假设您要记录每次访问。假设您希望它驻留在GPU上以进行一些加速计算。所有这些可能性都应该支持基本的堆栈操作,但可能并非所有这些操作都支持每个列表操作(或者您可能不想为它们中的每一个实现所有这些操作)。只要您保持相同的原始界面,您只需要对实现进行必要的最小更改,其余代码应该完全相同。

在像Python这样的语言中,它是高级的,动态类型的,并且具有全面的标准库,这些好处最初并不那么明显,但它们仍然适用于所有相同的。

以上是关于使用列表等其他数据结构实现Stack的主要内容,如果未能解决你的问题,请参考以下文章

Android,从其他片段返回的空列表视图

“栈”(stack)

stack栈

Android:RecyclerView 不显示片段中的列表项

如何在片段中填充列表视图?

使用主播放列表时,HLS.js 一次加载所有子片段