首页 > 编程语言 >python数据结构中实现队列的几种方法

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

时间:2024-01-18 16:59:17浏览次数:25  
标签:__ head return python self 队列 数据结构 def size

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)

运行结果:
在这里插入图片描述

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栈

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()

标签:__,head,return,python,self,队列,数据结构,def,size
From: https://www.cnblogs.com/xxpythonxx/p/17972844

相关文章

  • Python使用__dict__查看对象内部属性的名称和值
    1、定义一个类classMyObj:def__init__(self,name,age):self.name=nameself.age=agedefmyFunc(self):passmo=MyObj('Boby',24)print(mo)print(mo.__dict__)#结果<__main__.MyObjobjectat0x000000815C36451......
  • python编程中break pass continue这三个有什么区别?
    在Python编程中,break、pass和continue是三种不同的控制流语句,它们各自有不同的用途和行为:(以下内容由百度文心一言生成)   break:       break语句用于终止循环的执行。当程序执行到break语句时,会立即跳出当前循环,不再执行循环内的剩余代码,而是继续执行循环之后的代......
  • python llama_index
    PythonLlamaIndexIntroductionPythonisapopularprogramminglanguageknownforitssimplicityandreadability.Ithasavastecosystemoflibrariesandframeworksthatmakeitsuitableforawiderangeofapplications,fromwebdevelopmenttodataana......
  • python 安装 llama_index
    Python安装llama_index简介在进行数据分析和机器学习的过程中,我们经常需要对数据进行索引和检索。其中,llama_index是一个强大的Python库,用于快速构建和管理索引。它提供了各种功能,包括全文搜索、近似搜索、范围搜索等。本文将向您介绍如何安装和使用llama_index。安装要安装l......
  • python迭代器和生成器
    迭代器:定义:迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:iter()和next()。字符串,列表或元组对象都可用于创建迭代器:ex:#!/usr/bin/python3list=[1,2,3,4]it=iter(list)#创建迭代器对......
  • python的whisper工具包
    实现Python的Whisper工具包作为一名经验丰富的开发者,你需要教一位刚入行的小白如何实现Python的Whisper工具包。下面是整个实现的步骤概述:确定需求:首先需要明确Whisper工具包的功能和用途,以便为其设计合适的代码结构。安装必要的库:使用pip命令安装Python的相关库,如numpy、panda......
  • Python whisper识别
    Pythonwhisper识别Pythonwhisper识别是一个用于语音识别的开源Python库。它基于Google的语音识别API,通过将语音转换为文本,实现对语音数据的处理和分析。Pythonwhisper识别可以应用于各种场景,例如语音助手、语音命令控制和语音转写等。安装Pythonwhisper识别要使用Pythonwh......
  • python whisper没有分段
    PythonWhisper没有分段实现方法1.概述在本文中,我将向你介绍如何在Python中实现"Whisper没有分段"的功能。作为一名经验丰富的开发者,我将引导你完成这个任务,并提供每一步需要执行的代码示例和注释。2.任务流程下表显示了实现"Whisper没有分段"功能的步骤。我们将按照这些步骤......
  • python使用whisper用gpu进行计算
    如何使用Python和Whisper进行GPU计算引言:在计算机科学领域,GPU(图形处理器)已经成为进行高性能计算的重要工具。Python作为一种简单易用且功能强大的编程语言,也可以与GPU一起使用,实现各种复杂的计算任务。本文将向刚入行的小白介绍如何使用Python和Whisper库进行GPU计算。流程图:下......
  • python虚拟环境系列(五):pycharm中快速切换环境
     pycharm版本选择说明,pycharm中快速切换环境这个功能在比较新的版本中才有我目前版本比较老 所以卸载了:  官网下载最新社区版本:https://www.jetbrains.com.cn/en-us/pycharm/download/?section=windows 当前最新版本是:  安装最新版本pycharm基本上一路下一步即可 我做了如......