【问题标题】:What is the best way of implementing stack and queues in python, without using any modules?在不使用任何模块的情况下,在 python 中实现堆栈和队列的最佳方法是什么?
【发布时间】:2021-02-12 13:15:09
【问题描述】:

我已经尝试使用collections.dequequeue.Lifoqueue 来实现堆栈和队列,虽然它们都可以正常工作,但我想从头开始实现它。那么根据时间和空间复杂度,哪种方法最好呢?我尝试通过单链表和 python 列表函数来实现它。还有比这更好的方法吗?

【问题讨论】:

  • 在什么意义上更好?例如,list 可以完美地用作堆栈,您想改进什么?
  • 在 collections.OrderedDict 的文档中,他们给出了 OrderedSet 的可能实现。 OrderedSet 是使用双向链表实现的。您可能可以采用该实现,并折腾它的“设置”部分。
  • @juanpa.arrivillaga 是的,list 将完美运行是绝对正确的,但如果堆栈增长,它在速度和内存分配方面有其自身的缺点。所以从某种意义上说,我们可以更快地弹出和追加,而没有上述缺点并且不使用任何模块。
  • @DhruvSharma 到底有什么缺点? Python 列表对象具有摊销的常数时间追加和弹出。鉴于它们是在 C 中实现的,位于解释器层之下,您是否会在 pure python 中找到一个有效更快的数据结构来制作堆栈是值得怀疑的。

标签: python data-structures stack queue


【解决方案1】:

这里是队列。我评论了每个操作的时间复杂度

class QueuesArray:
    def __init__(self):
        self._data=[]
    def __len__(self): # O(1)
        return len(data)
    def isempty(self): # O(1)
        return len(self._data)==0
    def enqueue(self,e): #O(1)
        self._data.append(e)
        return e
    def dequeue(self): # O(1)
        if self.isempty():
            return ValueError("")
        return self._data.pop(0) # O(1)
    def first(self): # O(1)
        if self.isempty():
            print ('Queue is empty')
        return self._data[0]

这里是堆栈:

class StacksArray:
    def __init__(self):
        self._data=[]
    def __len__(self): # O(1)
        return len(self._data)
    def isempty(self): # O(1)
        return len(self._data)==0
    def push(self,e): # O(1)
        self._data.append(e)
        return e
    def pop(self): # O(1)+O(1)
        if self.isempty(): # O(1)
            print('stack is empty')
            raise IndexError
        else:
            return self._data.pop() # O(1)
    def top(self): # O(1)+O(1)
        if self.isempty(): # O(1)
            print('stack is empty')
            raise IndexError
        return self._data[-1] # O(1)

【讨论】:

    猜你喜欢
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2011-01-04
    • 1970-01-01
    相关资源
    最近更新 更多