python数据结构中实现队列的几种方法

这篇具有很好参考价值的文章主要介绍了python数据结构中实现队列的几种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.list实现 enqueue append() dequeue pop(0) 或 enqueue insert(0,item) dequeue pop()

MAX_SIZE = 100
class MyQueue1(object):
    """模拟队列"""

    def __init__(self):
        self.items = []
        self.size = 0

    def is_empty(self):
        """判断是否为空"""
        return self.size == 0

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

    def enqueue(self, item):
        """入队(加入元素)"""
        self.items.append(item)
        self.size += 1

    def dequeue(self):
        """出队(弹出元素)"""
        if self.size < MAX_SIZE and self.size >= 0:
            self.size -= 1
            return self.items.pop(0)
        else:
            print("队列已经为空")
            return None

    def getFront(self):
        if not self.is_empty():
            return self.items[0]
        else:
            return None
    
    def getRear(self):
        if not self.is_empty():
            return self.items[self.size-1]
        else:
            return None
    
    def __str__(self):
        return str(self.items)


class MyQueue2(object):
    """模拟队列"""
    def __init__(self):
        self.items = []
        self.size = 0

    def is_empty(self):
        """判断是否为空"""
        return self.size == 0

    def size(self):
        """返回队列的大小"""
        if self.size <= MAX_SIZE:
            return self.size

    def enqueue(self, item):
        """入队(加入元素)"""
        if self.size <= MAX_SIZE:
            self.items.insert(0, item)
            self.size += 1


    def dequeue(self):
        """出队(弹出元素)"""
        if self.size > 0 and self.size <= MAX_SIZE:
            self.size -= 1
            return self.items.pop()
        else:
            print("队列已经为空")
            return None

    def getFront(self):
        """返回队头元素"""
        if not self.is_empty():
            return self.items[0]
        else:
            return None
    def getRear(self):
        if not self.is_empty():
            return self.items[self.size-1]
        else:
            return None
    
    def __str__(self):
        return str(self.items)

def test(obj):
    i = obj()
    for x in range(0,6):
        i.enqueue(x)
        print(i)
    i.dequeue()
    print(i, i.getFront(), i.getRear(), i.size)

if __name__ == "__main__":
    test(MyQueue1)
    test(MyQueue2)

运行结果:
python数据结构中实现队列的几种方法

2.链队 前文已介绍

首尾指针实现
链队 首尾指针实现链队

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

class StcakQueue():
    def __init__(self):
        self.front = Node()
        self.rear = Node()
        self.size = 0

    def enqueue(self, value):
        node = Node(value)
        if self.size == 0:
            self.front = node
            self.rear = node
        else:
            self.rear.next = node
            self.rear = node
        self.size += 1

    def dequeue(self):
        if self.size == 0:
            raise Exception('queue is empty')
        else:
            temp = self.front.value
            self.front = self.front.next
            self.size -= 1
            return temp

    def is_empty(self):
        if self.size == 0 :
            return False
        else:
            return True

    def top(self):
        if self.size == 0 :
            raise LookupError('queue is empty')
        else:
            return self.front.value

    def size(self):
        return self.size

    def __str__(self):
        if self.size == 0:
            return None
        else:
            stack_list = []
            temp, count = self.front, self.size
            while count > 0 :
                stack_list.append(temp.value)
                temp = temp.next
                count -= 1
            return str(stack_list)
       

if __name__ == "__main__":
    i = StcakQueue()
    for x in range(0,6):
        i.enqueue(x)
        print(i)
    i.dequeue()
    print(i, i.size)

尾插有头结点实现链队
链队 尾插法 有头结点实现链队

class Node(): #结点类
    def __init__(self,elem):
        self.elem = elem # 数据域,用来存放数据元素
        self.next = None # 指针域,指向下一个结点

    def __str__(self):
        return str(self.elem)


class Queue(): # 队列
    def __init__(self): # 队列初始化
        self.head = None # 构造私有头结点
    
    def is_empty(self):
        return self.head == None

    def enqueue(self,elem): # 进队列(正常向后填元素)
        node = Node(elem) # 创建新结点
        if self.is_empty(): # 如果为空, 新建head结点
            self.head = Node
            self.head.next = node
            node = self.head
        else:
            current = self.head
            while current.next is not None:
                current = current.next
            current.next = node

    def dequeue(self): # 出队列(头出)
        if not self.is_empty():
            current = self.head.next
            self.head.next = self.head.next.next
            return current.elem
        else:
            raise IndexError('pop from a empty stack')
    
    def size(self):
        current = self.head
        count = 0
        while current.next is not None:
            current = current.next
            count += 1
        return count

    def __repr__(self):
        stack_list = []
        current = self.head
        while current.next is not None:
            stack_list.append(current.next.elem)
            current = current.next
        return str(stack_list)

    __str__ = __repr__


if __name__ == "__main__":
    i = Queue()
    for x in range(0, 6):
        i.enqueue(x)
        print(i)

    i.dequeue()
    print(i, i.size())

3.两个栈实现一个队列 O(1)

两个栈实现一个队列 list栈文章来源地址https://www.toymoban.com/news/detail-801808.html

class CQueue:
    def __init__(self):
        self.stack1 = []
        self.stack2 = []

    def append_tail(self, elem):
        self.stack1.append(elem)

    def delete_head(self):
        if not self.stack2:
            if self.stack1:
                while self.stack1:
                    elem = self.stack1.pop()
                    self.stack2.append(elem)
            else:
                raise Exception("Queue is empty.")
            
        elem = self.stack2.pop()
        return elem

#学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
def unitest():
    # Create an instance of class CQueue
    que = CQueue()
    print("Push 1, 2, 3 successively into CQueue.")
    for i in range(1, 4):
        que.append_tail(i)
    print("Pop the head of the queue:", que.delete_head())
    print("Pop the head of the queue:", que.delete_head())
    print("Push 4, 5, 6 successively into CQueue.")
    for i in range(4, 7):
        que.append_tail(i)
    # Pop the rest elements in the queue
    for i in range(4):
        print("Pop the head of the queue:", que.delete_head())
        

if __name__ == '__main__':
    unitest()

到了这里,关于python数据结构中实现队列的几种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 几种常见的Python数据结构

    摘要:本文主要为大家讲解在Python开发中常见的几种数据结构。 本文分享自华为云社区《Python的常见数据结构》,作者: timerring 。 元组是一个固定长度,不可改变的Python序列对象。创建元组的最简单方式,是用逗号分隔一列值: 当用复杂的表达式定义元组,最好将值放到

    2024年02月03日
    浏览(42)
  • Python数据结构与算法-数据结构(列表、栈、队列、链表)

    数据结构是指相互之间存在这一种或者多种关系的数据元素的集合和该集合中元素之间的关系组成。 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表、集合与字典等都是一种数据结构。 N.Wirth:“程序=数据结构+算法” 数据结构按照其 逻辑结

    2024年02月08日
    浏览(58)
  • 使用Python爬取GooglePlay并从复杂的自定义数据结构中实现解析

    【作者主页】: 吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建

    2024年02月04日
    浏览(47)
  • 数据结构:队列(Python语言实现)

    队列是一种 先进先出 的数据结构(特殊的线性结构),在队列 尾部 插入新元素,在队列 头部 删除元素。 一般队列的基本操作如下: create:创建空队列。 enqueue:将新元素加入队列的尾部,返回新队列。 dequeue:删除队列头部元素,返回新队列。 front:返回队列头部的元素

    2024年02月13日
    浏览(45)
  • 数据结构与算法之Python实现——队列

    在上一期博客中我们学习了栈这种结构,本期博客将学习一下跟栈很类似的一种结构——队列。 本期知识点: 顺序队列 循环队列 链式队列 队列的应用 ⚪️ 什么是队列? 队列是一种跟栈很相似的结构。我们知道栈是一种 先进后出 的结构,那么队列就像一个排队的队伍一样

    2024年02月06日
    浏览(46)
  • 基于Python的数据结构实验——循环顺序队列与递归(附详细代码和注释)

    1、创建名为 prac04_01.py 的文件,在其中编写一个循环顺序队列的类,该类必须包含 循环顺序队列的定义及基本操作,并通过以下步骤测试各种基本操作的实现是否正确。 (1)初始化一个循环顺序队列 CircularSequenceQueue。 (2)判断队列是否为空。 (3)遍历队列内的所有元素。 (4)将元

    2024年02月05日
    浏览(55)
  • django中实现事务的几种方式

    1.实现事务的三种方式 1.1 全局开启事务--- 全局开启事务,绑定的是http请求响应整个过程  1.2 一个视图函数在一个事物中 1.3 局部使用事务 保存点 在事务操作中,我们还会经常显式地设置保存点(savepoint) 一旦发生异常或错误,我们使用savepoint_rollback方法让程序回滚到指定的

    2024年02月12日
    浏览(46)
  • SpringBoot 中实现定时任务的几种方式

    定时任务在我们项目开发中也是很重要的,对于某些场景必须要用定时任务 ,如定时发送邮件啊,定时统计数据等,这篇文章主要讲讲项目中实现定时任务的几种方式。 这种方式很简单,主要就是先@EnableScheduling开启定时任务功能,然后在相应的方法上添加@Scheduled()中间写上

    2024年02月03日
    浏览(53)
  • vue中实现打印功能的几种方法

    这种方法默认打印整个页面,不能打印局部页面。并且不保留原有样式 这种方法也是调用了原生打印,通过封装好方法,可以指定需要打印的区域,自由度高,缺点就是通过截取全页面的html进行字符串截取,并且不保留原有样式,需要去手动添加样式。 2.1、封装打印方法,

    2024年02月15日
    浏览(43)
  • 探究Spring Boot 中实现跨域的几种方式

    在现代Web应用中,由于安全性和隐私的考虑,浏览器限制了从一个域向另一个域发起的跨域HTTP请求。解决这个问题的一种常见方式是实现跨域资源共享(CORS)。Spring Boot提供了多种方式来处理跨域请求,本文将介绍其中的几种方法。 Spring Boot提供了一个注解 @CrossOrigin ,可以

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包