百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Python | 数据结构 - 队列(python数据结构队列)

toyiye 2024-08-22 22:59 5 浏览 0 评论

队列的 Python 代码实现

队列是一种先进先出的数据类型。

应用场景:我们的计算机实验室有 30 台计算机与一台打印机联网。当学生想要打印时,他们的打印任务与正在等待的所有其他打印任务 “一致”。第一个进入的任务是先完成。如果你是最后一个,你必须等待你前面的所有其他任务打印。

接下来,我们将通过 Python 代码创建要给对列:

接下来,我们将通过 Python 代码创建要给对列:

  • Queue() 创建一个空的新队列。 它不需要参数,并返回一个空队列。
  • enqueue(item) 将新项添加到队尾。 它需要 item 作为参数,并不返回任何内容。
  • dequeue() 从队首移除项。它不需要参数并返回 item。 队列被修改。
  • isEmpty() 查看队列是否为空。它不需要参数,并返回布尔值。
  • size() 返回队列中的项数。它不需要参数,并返回一个整数。
class Queue:
    def __init__(self):
        self.items = []
        
    def enqueue(self, item):
        self.items.insert(0, item)
    
    def dequeue(self):
        return self.items.pop()
    
    def isEmpty(self):
        return self.items == []
    
    def size(self):
        return len(self.items)
    
if __name__ == '__main__':
    q = Queue()
    print(q.isEmpty())    # True
    q.enqueue(1)
    q.enqueue(2)
    q.enqueue(3)
    print(q.isEmpty())    # False
    print(q.size())    # 3
    print(q.dequeue())    # 1
    print(q.dequeue())    # 2
    print(q.dequeue())    # 3

案例:烫手的山芋

烫手山芋游戏介绍:6 个孩子围城一个圈,排列顺序孩子们自己指定。第一个孩子手里有一个烫手的山芋,需要在计时器计时 1 秒后将山芋传递给下一个孩子,依次类推。规则是,在计时器每计时 7 秒时,手里有山芋的孩子退出游戏。该游戏直到剩下一个孩子时结束,最后剩下的孩子获胜。请使用队列实现该游戏策略,排在第几个位置最终会获胜。

分析:

  • 在一轮游戏中山芋会被传递 6 次
  • 山芋传递的次数不受孩子个数的影响
  • 山芋传递 6 次后一轮游戏结束,淘汰一个孩子游戏继续
  • 队列:先进先出,只可以从对头取元素,从队尾添加元素
  • 准则:保证队头孩子手里面有山芋(谁手里有山芋谁作为队头)方便删除元素。最终 7 秒到的时候需要将手里有山芋的孩子从队列中剔除。
children = ['A', 'B', 'C', 'D', 'E', 'F']
q = Queue()
# 将6个孩子添加到了队列中
for child in children:
    q.enqueue(child)

while q.size() > 1:
    # 游戏开始,开始传递山芋
    # 山芋传递的次数
    for i in range(6):
        # 让队头的孩子出队列再入队列,成为队尾
        q.enqueue(q.dequeue())
    # 当6次循环结束后,说明山芋被传递了6次,说明一轮游戏结束
    # 一轮游戏结束后,将对头孩子淘汰即可
    q.dequeue()

print('获胜者:',q.dequeue())    # 获胜者: E

双端队列

同普通队列相比,双端队列有两个头部和尾部。可以在双端进行数据的插入和删除,提供了单数据结构中栈和队列的双重特性。

接下来,我们通过 Python 代码创建一个双端队列

  • Deque() 创建一个空的新 deque。它不需要参数,并返回空的 deque。
  • addFront(item) 将一个新项添加到 deque 的首部。它需要 item 参数 并不返回任何内容。
  • addRear(item) 将一个新项添加到 deque 的尾部。它需要 item 参数并不返回任何内容。
  • removeFront() 从 deque 中删除首项。它不需要参数并返回 item。deque 被修改。
  • removeRear() 从 deque 中删除尾项。它不需要参数并返回 item。deque 被修改。
  • isEmpty() 测试 deque 是否为空。它不需要参数,并返回布尔值。
  • size() 返回 deque 中的项数。它不需要参数,并返回一个整数。
class Deque:
    def __init__(self):
        self.items = []
        
    def addFront(self, item):
        self.items.append(item)
        
    def addRear(self, item):
        self.items.insert(0, item)
        
    def removeFront(self):
        return self.items.pop()
    
    def removeRear(self):
        return self.items.pop(0)
    
    def isEmpty(self):
        return self.items == []
    
    def size(self):
        return len(self.items)
    
if __name__ == '__main__':
    dq = Deque()
    print(dq.isEmpty())    # True
    dq.addFront(1)
    dq.addRear(2)
    dq.addFront(3)
    dq.addRear(4)
    # 尾 4213 头
    print(dq.isEmpty())    # False
    print(dq.size())    # 4
    print(dq.removeRear())    # 4
    print(dq.removeFront())    # 3
    print(dq.removeFront())    # 1
    print(dq.removeRear())    # 2

双端队列应用案例:回文检查

回文是一个字符串,读取首尾相同的字符,例如,radar toot madam。

def check_palindrome(s):
    dq = Deque()
    for c in s:
        dq.addFront(c)
    while dq.size() > 1:
        if dq.removeFront() != dq.removeRear():
            return False
    return True

if __name__ == '__main__':
    print(check_palindrome('raddar'))    # True
    print(check_palindrome('上海自来水来自海上'))    # True
    print(check_palindrome('这不是回文'))    # False
    print(check_palindrome(''))    # True
    print(check_palindrome('a'))    # True
    print(check_palindrome('ab'))    # False

使用两个栈实现队列

利用两个栈实现先进先出的特性,实现一个队列的功能。

class Stack:
    def __init__(self):
        self.items = []    # 构建一个空栈
        
    def push(self, item):    # 从栈顶添加到栈底
        self.items.append(item)
        
    def pop(self):    # 从栈顶向栈底取元素
        return self.items.pop()
    
    def peek(self):    # 返回栈顶元素下标
        return len(self.items) - 1
    
    def isEmpty(self):
        return self.items == []
    
    def size(self):
        return len(self.items)

class Queue:
    def __init__(self):
        self.s1 = Stack()
        self.s2 = Stack()
        
    def enqueue(self, item):
        while self.s1.size():
            self.s2.push(self.s1.pop())
        self.s2.push(item)
        while self.s2.size():
            self.s1.push(self.s2.pop())
    
    def dequeue(self):
        return self.s1.pop()
    
    def isEmpty(self):
        return self.s1.isEmpty()
    
    def size(self):
        return self.s1.size()
    
if __name__ == '__main__':
    q = Queue()
    print(q.isEmpty())    # True
    q.enqueue(1)
    q.enqueue(2)
    q.enqueue(3)
    print(q.isEmpty())    # False
    print(q.size())    # 3
    print(q.dequeue())    # 1
    print(q.dequeue())    # 2
    print(q.dequeue())    # 3

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码