python实现stack(栈)和队列(queue)

Posted 命定的局限尽可永在,不屈的挑战却不可须臾或缺!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实现stack(栈)和队列(queue)相关的知识,希望对你有一定的参考价值。

栈和队列是两种基本的数据结构,同为容器类型。两者根本的区别在于:
stack:后进先出

技术图片


queue:先进先出

技术图片

stack和queue是没有查询具体某一个位置的元素的操作的。但是他们的排列是按顺序的

对于stack我们可以使用python内置的list实现,因为list是属于线性数组,在末尾插入和删除一个元素所使用的时间都是O(1),这非常符合stack的要求。当然,我们也可以使用链表来实现。

stack的实现代码(使用python内置的list),实现起来是非常的简单,就是list的一些常用操作


class Stack(object):
    def __init__(object):
        self.stack = []

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

    def pop(self):
        if self.stack:
            self.stack.pop()
        else:
            raise LookupError(‘stack is empty!‘)

    def is_empty(self):
        return bool(self.stack)

    def top(self):
        #取出目前stack中最新的元素
        return self.stack[-1]

定义如下的链表来实现队列数据结构:

技术图片

定义一个头结点,左边指向队列的开头,右边指向队列的末尾,这样就可以保证我们插入一个元素和取出一个元素都是O(1)的操作,使用这种链表实现stack也是非常的方便。实现代码如下:

class Head(object):
    def __init__(self):
        self.left = None
        self.right = None

class Node(object):
    def __init__(self, value):
        self.value = value
        self.next = None

class Queue(object):
    def __init__(self):
        #初始化节点
        self.head = Head()

    def enqueue(self, value):
        #插入一个元素
        newnode = Node(value)
        p = self.head
        if p.right:
            #如果head节点的右边不为NOne
            #说明队列中已经有元素了
            #就执行下列的操作
            temp = p.right
            p.right = newnode
            temp.next = newnode
        else:
            #这说明队列为空,插入第一个元素
            p.right = newnode
            p.left = newnode

    def dequeue(self):
        #取出一个元素
        p = self.head
        if p.left and (p.left == p.right):
            #说明队列中已经有元素
            #但是这是最后一个元素
            temp = p.left
            p.left = p.right = None
            return temp.value
        elif p.left and (p.left != p.right):
            #说明队列中有元素,而且不止一个
            temp = p.left
            p.left = temp.next
            return temp.value

        else:
            #说明队列为空
            #抛出查询错误
            raise LookupError(‘queue is empty!‘)

    def is_empty(self):
        if self.head.left:
            return False
        else:
            return True

    def top(self):
        #查询目前队列中最早入队的元素
        if self.head.left:
            return self.head.left.value
        else:
            raise LookupError(‘queue is empty!‘)

以上是关于python实现stack(栈)和队列(queue)的主要内容,如果未能解决你的问题,请参考以下文章

用两个栈(Stack)实现一个队列(Queue)

C++stack&queue(栈队列优先级队列)

C++stack&queue(栈队列优先级队列)

C++stack&queue(栈队列优先级队列)

C++stack&queue(栈队列优先级队列)

LeetCode#225-Implement Stack using Queues-用队列实现栈