iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python队列的练习题有哪些
  • 737
分享到

Python队列的练习题有哪些

2023-06-29 18:06:05 737人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要为大家展示了“python队列的练习题有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python队列的练习题有哪些”这篇文章吧。1. 使用两个栈实现一个队列[问题] 给定两个栈

这篇文章主要为大家展示了“python队列的练习题有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python队列的练习题有哪些”这篇文章吧。

1. 使用两个栈实现一个队列

[问题] 给定两个栈,仅使用栈的基本操作实现一个队列。

[思路] 解决此问题的关键在于栈的反转特性,入栈的一系列元素在出栈时会以相反的顺序返回。因此,使用两个栈就可以实现元素以相同的顺序返回(反转的元素序列再次反转后就会得到原始顺序)。具体操作如下图所示:

Python队列的练习题有哪些

[算法]

 入队 enqueue
   将元素推入栈 stack_1
 出队 dequeue
   如果栈 stack_2 不为空:
     stack_2 栈顶元素出栈
   否则:
     将所有元素依次从 stack_1 弹出并压入 stack_2
     stack_2 栈顶元素出栈

[代码]

class Queue:    def __init__(self):        self.stack_1 = Stack()        self.stack_2 = Stack()    def enqueue(self, data):        self.stack_1.push(data)    def dequeue(self):        if self.stack_2.isempty():            while not self.stack_1.isempty():                self.stack_2.push(self.stack_1.pop())        return self.stack_2.pop()

[时空复杂度] 入队时间复杂度为 O(1),如果栈 stack_2 不为空,那么出队的时间复杂度为 O(1),如果栈 stack_2 为空,则需要将元素从 stack_1 转移到 stack_2,但由于 stack_2 中转移的元素数量和出队的元素数量是相等的,因此出队的摊销时间复杂度为 O(1)。

2. 使用两个队列实现一个栈

[问题] 给定两个队列,仅使用队列的基本操作实现一个栈。

[思路] 由于队列并不具备反转顺序的特性,入队顺序即为元素的出队顺序。因此想要获取最后一个入队的元素,需要首先将之前所有元素出队。因此为了使用两个队列实现栈,我们需要将其中一个队列 store_queue 用于存储元素,另一个队列 temp_queue 则用来保存为了获取最后一个元素而保存临时出队的元素。push 操作将给定元素入队到存储队列 store_queue 中;pop 操作首先把存储队列 store_queue 中除最后一个元素外的所有元素都转移到临时队列 temp_queue 中,然后存储队列 store_queue 中的最后一个元素出队并返回。具体操作如下图所示:

Python队列的练习题有哪些

[算法]

算法运行过程需要始终保持其中一个队列为空,用作临时队列
 入栈 push:在非空队列中插入元素 data
   若队列 queue_1 为空:
     将 data 插入 队列 queue_2
   否则:
     将 data 插入 队列 queue_1
 出栈 pop:将队列中的前n−1 个元素插入另一队列,删除并返回最后一个元素
   若队列 queue_1 不为空:
     将队列 queue_1 的前n−1 个元素插入 queue_2,然后 queue_1 的最后一个元素出队并返回
   若队列 queue_2 不为空:
     将队列 queue_2 的前 n−1 个元素插入 queue_1,然后 queue_2 的最后一个元素出队并返回

[代码]

class Stack:    def __init__(self):        self.queue_1 = Queue()        self.queue_2 = Queue()    def isempty(self):        return self.queue_1.isempty() and self.queue_2.isempty()    def push(self, data):        if self.queue_2.isempty():            self.queue_1.enqueue(data)        else:            self.queue_2.enqueue(data)    def pop(self):        if self.isempty():            raise IndexError("Stack is empty")        elif self.queue_2.isempty():            while not self.queue_1.isempty():                p = self.queue_1.dequeue()                if self.queue_1.isempty():                    return p                self.queue_2.enqueue(p)        else:            while not self.queue_2.isempty():                p = self.queue_2.dequeue()                if self.queue_2.isempty():                    return p                self.queue_1.enqueue(p)

[时空复杂度] push 操作的时间复杂度为O(1),由于 pop 操作时,都需要将所有元素从一个队列转移到另一队列,因此时间复杂度O(n)。

3. 栈中元素连续性判断

[问题] 给定一栈 stack1,栈中元素均为整数,判断栈中每对连续的数字是否为连续整数(如果栈有奇数个元素,则排除栈顶元素)。例如,输入栈 [1, 2, 5, 6, -5, -4, 11, 10, 55],输入为 True,因为排除栈顶元素 55 后,(1, 2)(5, 6)(-5, -4)(11, 10) 均为连续整数。

[思路] 由于栈中可能存在奇数个元素,因此为了正确判断,首次需要将栈中元素反转,栈顶元素变为栈底,然后依次出栈,进行判断。

[算法]

 栈 stack 中所有元素依次出栈,并插入队列 queue
 队列 queue 中所有元素出队,并入栈 stack
  while 栈 stack 不为空:
   栈顶元素 e1 出栈,并插入队列 queue
   如果栈 stack 不为空:
     栈顶元素 e2 出栈,并插入队列 queue
     如果 |e1-e2|!=1
       返回 False,跳出循环
 队列 queue 中所有元素出队,并入栈 stack

[代码]

def check_stack_pair(stack):    queue = Queue()    flag = True    # 反转栈中元素    while not stack.isempty():        queue.enqueue(stack.pop())    while not queue.isempty():        stack.push(queue.dequeue())    while not stack.isempty():        e1 = stack.pop()        queue.enqueue(e1)        if not stack.isempty():            e2 = stack.pop()            queue.enqueue(e2)            if abs(e1-e2) != 1:                flag = False                break    while not queue.isempty():        stack.push(queue.dequeue())    return flag

[时空复杂度] 时间复杂度为 O(n),空间复杂度为 O(n)。

4. 重新排列队列中元素顺序

[问题] 给定一个整数队列 queue,将队列的前半部分与队列的后半部分交错来重新排列元素。例如输入队列为 [1, 2, 3, 4, 5, 6, 7, 8, 9],则输出应为 [1, 6, 2, 7, 3, 8, 4, 9, 5]

[思路] 通过获取队列的前半部分,然后利用栈的反转特性,可以实现重排操作,如下图所示:

Python队列的练习题有哪些

[算法]

 如果队列 queue 中的元素数为偶数:
   half=queue.size//2
 否则:
   half=queue.size//2+1
 1. 将队列 queue 的前半部分元素依次出队并入栈 stack
 2. 栈 stack 中元素出栈并入队 queue
 3. 将队列 queue 中在步骤 1中未出队的另一部分元素依次出队并插入队尾
 4. 将队列 queue 的前半部分元素依次出队并入栈 stack
 5. 将栈 stack 和队列 queue 中的元素交替弹出并入队
 6. 如果栈 stack 非空:
   栈 stack 中元素出栈并入队

[代码]

def queue_order(queue):    stack = Stack()    size = queue.size    if size % 2 == 0:        half = queue.size//2    else:        half = queue.size//2 + 1    res = queue.size - half    for i in range(half):        stack.push(queue.dequeue())    while not stack.isempty():        queue.enqueue(stack.pop())    for i in range(res):        queue.enqueue(queue.dequeue())    for i in range(half):        stack.push(queue.dequeue())    for i in range(res):        queue.enqueue(stack.pop())        queue.enqueue(queue.dequeue())    if not stack.isempty():        queue.enqueue(stack.pop())

[时空复杂度] 时间复杂度为O(n),空间复杂度为 O(n)。

5. 反转队列中前 m 个元素的顺序

[问题] 给定一个整数 m 和一个整数队列 queue,反转队列中前 k 个元素的顺序,而其他元素保持不变。如 m=5,队列为 [1, 2, 3, 4, 5, 6, 7, 8, 9],算法输出为 [5, 4, 3, 2, 1, 6, 7, 8, 9]

[思路] 结合 [问题4] 我们可以发现,此题就是 [问题4] 的前 3 步,如下图所示:

Python队列的练习题有哪些

[算法]

 1. 将队列 queue 的前 m 个元素依次出队并入栈 stack
 2. 栈 stack 中元素出栈并入队 queue
 3. 将队列 queue 中在步骤 1中未出队的另一部分元素依次出队并插入队尾

[代码]

def reverse_m_element(queue, m):    stack = Stack()    size = queue.size    if queue.isempty() or m>size:        return    for i in range(m):        stack.push(queue.dequeue())    while not stack.isempty():        queue.enqueue(stack.pop())    for i in range(size-m):        queue.enqueue(queue.dequeue())

[时空复杂度] 时间复杂度为O(n),空间复杂度为 O(n)。

以上是“Python队列的练习题有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网Python频道!

--结束END--

本文标题: Python队列的练习题有哪些

本文链接: https://www.lsjlt.com/news/326054.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python队列的练习题有哪些
    这篇文章主要为大家展示了“Python队列的练习题有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python队列的练习题有哪些”这篇文章吧。1. 使用两个栈实现一个队列[问题] 给定两个栈...
    99+
    2023-06-29
  • Python有哪些练习题
    这篇文章主要介绍了Python有哪些练习题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python有哪些练习题文章都会有所收获,下面我们一起来看看吧。实例051:按位与题目:学习使用按位与 & 。程序...
    99+
    2023-06-28
  • 基础Python练习题有哪些
    本篇内容主要讲解“基础Python练习题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基础Python练习题有哪些”吧!1. 输入一个百分制成绩,要求输出成绩等级A、B、C、D、E,其中9...
    99+
    2023-06-25
  • Python装饰器的练习题有哪些
    这篇文章主要讲解了“Python装饰器的练习题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python装饰器的练习题有哪些”吧!1.请实现一个装饰器,把函数的返回值+100然后返回d...
    99+
    2023-06-25
  • python的while循环练习题有哪些
    这篇文章主要介绍“python的while循环练习题有哪些”,在日常操作中,相信很多人在python的while循环练习题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python的while循环练习题...
    99+
    2023-06-21
  • Java练习题有哪些
    这篇文章给大家分享的是有关Java练习题有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、在异常处理中,如释放资源,关闭数据库、关闭文件应由( )语句来完成。正确答案: C try子句catch子句fina...
    99+
    2023-06-20
  • 【练习题】python列表
    Python列表练习题 1. 基础题 已知一个数字列表,打印列表中所有的奇数 list1 = [11, 53, 40, 45, 27, 16, 28, 99]list = []for x in li...
    99+
    2023-10-23
    python 开发语言
  • Python基础练习题目有哪些
    这篇文章主要讲解了“Python基础练习题目有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python基础练习题目有哪些”吧!1 、题目:有5个数字:1、2、3、4,5能组成...
    99+
    2023-06-02
  • C++链表练习题有哪些
    这篇文章主要为大家展示了“C++链表练习题有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++链表练习题有哪些”这篇文章吧。反转单链表题目1:给你单链表的头节点 head&nbs...
    99+
    2023-06-29
  • Java笔试练习题有哪些
    本篇内容介绍了“Java笔试练习题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下列属于合法标识符的是__________。A)&am...
    99+
    2023-06-17
  • Java日常练习题有哪些
    这篇文章将为大家详细讲解有关Java日常练习题有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、下列类在多重catch中同时出现时,哪一个异常类应最后一个列出()正确答案: C Arithmetic...
    99+
    2023-06-20
  • python基本数据类型练习题有哪些
    这篇文章主要为大家展示了“python基本数据类型练习题有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python基本数据类型练习题有哪些”这篇文章吧。题目[1]:格式输出练习。在交互式状...
    99+
    2023-06-28
  • Python实战项目代码练习题有哪些
    这篇文章主要介绍“Python实战项目代码练习题有哪些”,在日常操作中,相信很多人在Python实战项目代码练习题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python实战项目代码练习题有哪些”的疑...
    99+
    2023-06-29
  • web前端javascript练习题有哪些
    这篇文章主要讲解了“web前端javascript练习题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web前端javascript练习题有哪些”吧!编写任意个数字的求和、差、积、商的...
    99+
    2023-06-05
  • java的队列有哪些
    java中的队列有:1.ArrayBlockingQueue,基于数组结构的有界阻塞队列;2.LinkedBlockingQueue,基于链表结构的阻塞队列;3.PriorityBlockingQueue,具有优先级的无限阻塞队列;4.Sy...
    99+
    2024-04-02
  • java常见递归练习题有哪些
    小编给大家分享一下java常见递归练习题有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,Java是面...
    99+
    2023-06-14
  • java队列有哪些
    java中的队列有:1.阻塞队列,支持两个附加操作的队列;2.非阻塞队列,一个线程的失败或挂起不会影响其他线程的失败或挂起;java中的队列有以下两种阻塞队列java中阻塞队列是一个支持两个附加操作的队列,当队列为空时,获取元素的线程会等待...
    99+
    2024-04-02
  • Python队列的使用方法有哪些
    python中使用到的队列模块大致有三个:1、from queue import Queue此模块适用于线程间通信,但不能用于进程间通信。示例代码1: 【注意:此时代码存在错误!!!】import time import threading...
    99+
    2023-05-14
    Python
  • python消息队列框架有哪些
    python中的消息队列框架有RabbitMQ、Redis、ZeroMQ、Jafka几种RabbitMQRabbitMQ是一个使用Erlang编写的开源消息队列框架,RabbitMQ支持AMQP、XMPP、SMTP、STOMP等协议,常用于...
    99+
    2024-04-02
  • C语言中函数练习题有哪些
    小编给大家分享一下C语言中函数练习题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第壹题 :字符串逆序(递归实现)方法一,非递归实现main主体部分数组名是...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作