欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python实现栈、队列和双端队列

程序员文章站 2024-03-18 12:25:58
...

文章目录

栈(stack)是一种容器,它的特点在于只允许在容器的一端(称为栈顶指标,即top)进行加入数据(push)和输出数据(pop)的运算,即按照后进先出(LIFO,Last In First Out)的原理运作。
栈可以用顺序表实现,也可以用链表实现。顺序表或链表决定了数据如何存放,栈决定了数据如何操作。
Python中的列表(List)就相当于顺序表,现在我们采用List来实现栈。
我们需要实现的栈包含以下几种操作:

  • Stack() 创建一个新的空栈
  • push(elem) 添加一个新的元素elem到栈顶
  • pop() 弹出栈顶元素
  • peek() 返回栈顶元素
  • is_empty() 判断栈是否为空
  • size() 返回栈的元素个数

下面直接看代码实现:

class Stack(object):
    """栈"""
    def __init__(self):
        self.__list = []

    def push(self, elem):
        """添加一个新元素elem到栈顶"""
        self.__list.append(elem)

    def pop(self):
        """弹出栈顶元素"""
        if self.is_empty():
            return None
        else:
            return self.__list.pop()

    def peek(self):
        """返回栈顶元素"""
        if self.__list:
            return self.__list[-1]
        else:
            return None

    def is_empty(self):
        """判断栈是否为空"""
        return [] == self.__list

    def size(self):
        """返回栈的元素个数"""
        return len(self.__list)


if __name__ == '__main__':
    s = Stack()
    s.push(1)
    s.push(2)
    s.push(3)
    s.push(4)
    print(s.pop())  # 4
    print(s.pop())  # 3
    print(s.pop())  # 2
    print(s.pop())  # 1

队列

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出的(FIFO,First In First Out)的线性表,允许插入的一端为队尾,允许删除的一端为队头。队列数据结构的操作和我们平时排队是一致的,排在队头的先出列完成事务,新来的人只能排在队尾。
队列的常用操作为:

  • Queue() 创建一个空的队列
  • enqueue(elem) 往队列中添加一个elem元素
  • dequeue() 从队列头部删除一个元素
  • is_empty() 判断一个队列是否为空
  • size() 返回队列的大小

代码实现为:

class Queue(object):
    def __init__(self):
        """创建一个空的队列"""
        self.__list = []

    def enqueue(self, elem):
        """往队列中添加一个item元素"""
        self.__list.append(elem)

    def dequeue(self):
        """从队列头部删除一个元素"""
        if self.is_empty():
            return None
        else:
            return self.__list.pop(0)

    def is_empty(self):
        """判断一个队列是否为空"""
        return [] == self.__list

    def size(self):
        """返回队列的大小"""
        return len(self.__list)


if __name__ == '__main__':
    q = Queue()
    q.enqueue(1)
    q.enqueue(2)
    q.enqueue(3)
    q.enqueue(4)
    print(q.dequeue())
    print(q.dequeue())
    print(q.dequeue())
    print(q.dequeue())

双端队列

双端队列(deque,全名double-ended queue),是一种同时具有队列和栈的性质的数据结构。
双端队列中的元素可以从两端插入和删除。
双端队列的常用操作为:

  • Deque() 创建一个空的双端队列
  • add_front(elem) 从队头加入一个elem元素
  • add_rear(elem) 从队尾加入一个elem元素
  • pop_front() 从队头删除一个elem元素
  • pop_rear() 从队尾删除一个elem元素
  • is_empty() 判断双端队列是否为空
  • size() 返回双端队列的大小

代码实现:

class Deque(object):
    """双端队列"""
    def __init__(self):
        """创建一个空的队列"""
        self.__list = []

    def add_front(self, elem):
        """往双端对列头部添加一个elem元素"""
        self.__list.insert(0, elem)

    def add_rear(self, elem):
        """往双端队列尾部添加一个elem元素"""
        self.__list.append(elem)

    def pop_front(self):
        """从双端队列头部取出一个元素"""
        if self.is_empty():
            return None
        else:
            return self.__list.pop(0)

    def pop_rear(self):
        """从双端对列尾部取出一个元素"""
        if self.is_empty():
            return None
        else:
            return self.__list.pop()

    def is_empty(self):
        """判断一个队列是否为空"""
        return [] == self.__list

    def size(self):
        """返回队列的大小"""
        return len(self.__list)


if __name__ == '__main__':
    dq = Deque()
    dq.add_front(1)
    dq.add_front(2)
    dq.add_rear(3)
    dq.add_rear(4)
    print(dq.pop_rear())
    print(dq.pop_front())