首页 > 其他分享 >数据结构-队列

数据结构-队列

时间:2024-04-13 16:44:05浏览次数:25  
标签:队列 self print front cq 数据结构 rear

数据结构-队列

1. 定义:

队列是一种遵循先进先出(FIFO, First In First Out)原则的线性数据结构。在队列中,元素从一端添加(队尾),从另一端移除(队头)。

class Queue:
    def __init__(self):
        self.items = []
  1. 主要操作:
    队列的主要操作包括enqueue(向队尾添加元素)、dequeue(从队头移除元素)和dequeue(查看队头元素),以及isEmpty(检查队列是否为空)。
  2. enqueue
def enqueue(self, item):
        self.items.append(item)
  1. dequeue
def dequeue(self):
        if not self.is_empty():
            return self.items.pop(0)
        else:
            print("Queue is empty")
            return None
  1. dequeue1
def dequeue1(self):
      return self.items[0]
  1. isEmpty
def is_empty(self):
        return len(self.items) == 0

此处判断队和栈方法不一样的原因:
在 Python 中,队列(Queue)和栈(Stack)都可以使用列表(List)来实现。在这两种数据结构中,is_empty() 方法都是用来检查数据结构是否为空的。

  • 对于栈来说,使用 self.items == [] 来检查是否为空是因为栈是一种后进先出(LIFO)的数据结构,也就是说最后进入栈的元素会最先被取出。所以如果栈为空,那么 self.items 列表应该是空的。

  • 而对于队列来说,使用 len(self.items) == 0 来检查是否为空是因为队列是一种先进先出(FIFO)的数据结构,也就是说最先进入队列的元素会最先被取出。虽然也可以使用 self.items == [] 来检查队列是否为空,但是在一些情况下,使用 len(self.items) == 0 更为直观和清晰。

总的来说,这两种方式都可以用来检查数据结构是否为空,选择哪种方式取决于个人偏好和代码的清晰度。

3. 特性:

队列提供了一种按照元素添加顺序处理数据的方式。它限制了元素的访问顺序,确保最先添加的元素最先被处理。

4. 应用:

队列广泛应用于数据处理和任务调度领域,如操作系统的任务调度、打印队列管理、网络请求处理等。

5. 变体:

队列有多种变体,包括循环队列(在固定大小的队列中循环使用空间)、优先级队列(元素按照优先级出队)、双端队列(两端都可以进队和出队)。

  • 循环队列:
class CircularQueue:
    def __init__(self, capacity):
        self.capacity = capacity
        self.queue = [None] * capacity
        self.front = self.rear = -1

    def enqueue(self, item):
        if (self.rear + 1) % self.capacity == self.front:
            print("队列已满")
        elif self.front == -1:
            self.front = 0
            self.rear = 0
            self.queue[self.rear] = item
        else:
            self.rear = (self.rear + 1) % self.capacity
            self.queue[self.rear] = item

    def dequeue(self):
        if self.front == -1:
            print("队列为空")
        elif self.front == self.rear:
            temp = self.queue[self.front]
            self.front = -1
            self.rear = -1
            return temp
        else:
            temp = self.queue[self.front]
            self.front = (self.front + 1) % self.capacity
            return temp

    def display(self):
        if self.front == -1:
            print("队列为空")
        elif self.rear >= self.front:
            for i in range(self.front, self.rear + 1):
                print(self.queue[i], end=" ")
            print()
        else:
            for i in range(self.front, self.capacity):
                print(self.queue[i], end=" ")
            for i in range(0, self.rear + 1):
                print(self.queue[i], end=" ")
            print()


# 示例用法
cq = CircularQueue(5)
cq.enqueue(1)
cq.enqueue(2)
cq.enqueue(3)
cq.enqueue(4)
cq.enqueue(5)
cq.display()
cq.dequeue()
cq.dequeue()
cq.enqueue(6)
cq.enqueue(7)
cq.display()

  • 优先级队列:
import heapq

class PriorityQueue:
    def __init__(self):
        self.queue = []
        self.index = 0

    def push(self, item, priority):
        heapq.heappush(self.queue, (-priority, self.index, item))
        self.index += 1

    def pop(self):
        return heapq.heappop(self.queue)[-1]

# 示例用法
pq = PriorityQueue()
pq.push('task1', 5)
pq.push('task2', 1)
pq.push('task3', 3)
print(pq.pop())  # 输出:task1
print(pq.pop())  # 输出:task3
  • 双端队列:
from collections import deque

# 创建一个双端队列
d = deque()

# 两端进队
d.append(1)   # 右端进队
d.appendleft(2)   # 左端进队

# 两端出队
print(d.pop())   # 右端出队,输出:1
print(d.popleft())   # 左端出队,输出:2

标签:队列,self,print,front,cq,数据结构,rear
From: https://www.cnblogs.com/zx-demo/p/18133050

相关文章

  • 数据结构-栈
    数据结构-栈1.定义:栈是一种只能在一端进行插入和删除操作的线性数据结构。它遵循后进先出(LIFO,LastInFirstOut)的原则,即最后插入的元素将是第一个被移除的classStack:def__init__(self):self.items=[]defis_empty(self):returnself.ite......
  • 数据结构-堆
    数据结构-堆1.定义:堆是一种特殊的完全二叉树。在堆中,所有的父节点都满足特定的顺序关系(大于或小于)与它们的子节点。这种属性使得堆在处理优先级队列和排序操作时非常有效。2.类型:常见的两种类型的堆是最大堆和最小堆。在最大堆中,每个父节点的值都大于或等于其子节点的值;而在......
  • 数据结构-哈希表
    数据结构-哈希表1.定义:哈希表(也称为散列表)是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。它通过将键映射到表中一个位置来访问记录,从而加快访问速度。#创建一个空字典hash_table={}#向哈希表中添加键-值对hash_table['apple']=10hash_table['banana'......
  • 数据结构-链表
    数据结构-链表1.链表的基本概念:链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向列表中下一个节点的引用(或指针)。2.单向链表:单向链表的每个节点只有一个指向下一个节点的链接。这种结构使得遍历只能单向进行,从头节点开始到尾节点结束。classNode:d......
  • 数据结构基础概念
    数据结构基础概念数据结构概念数据结构是计算机科学中用于组织和存储数据的方式。它定义了数据之间的关系,提供了一组操作以访问和修改数据。选择合适的数据结构对于解决特定问题至关重要,不同的数据结构适用于不同的应用场景。以下是数据结构的基本概念:数据元素:数据结构中的基......
  • 数据结构知识框架
    数据结构知识框架B树平衡的多叉树性质根结点至少有两个孩子每个非根结点至少有M/2(上取整)个孩子,至多有M个孩子每个非根结点至少有M/2-1(上取整)个关键字,并且以升序排列key[i]和key[i+1]之间的孩子结点的值介于key[i]、key[i+1]之间所有的叶子结点都在同一层B+树性质......
  • 后缀数据结构
    byDuck.后缀数组参考:后缀数组简介-OIWiki后缀数组(SuffixArray,SA)可以在\(\mathcal{O}(n\logn)\)的复杂度内对\(S\)的每个后缀进行字典序排序。记后缀\(i\)表示后缀\(S[i,n]\)。SA的核心在于得到两个数组\(sa,rk\)。\(sa_i\)表示字典序排名为\(i\)的后缀位......
  • JDK11下的优先级队列小问题
    优先级队列中存了我自定义的对象,比较规则写好了,存完了之后我去修改堆中对象的值(比较器中写的值),发现堆没有即刻相应调整,导致结果不对但是每次我让堆中出一个,再进一个堆就调整好了暂时不知道什么原因,猜测可能是堆中存对象的话需要改动才会调整。......
  • 数据结构(图)
    图是一种非线性数据结构,由顶点(节点)和边组成,用于描述不同对象之间的关系。在图中,顶点表示对象,边表示对象之间的关系,可以是有向的(箭头表示方向)也可以是无向的(没有方向)。图的定义包括以下几个重要概念:顶点(Vertex):图中的节点,可以表示对象或实体。边(Edge):连接顶点的线,表示顶点之间的关......
  • 数据结构(堆)
    堆就是用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。堆的常用方法:构建优先队列支持堆排序快速找出一个集合中的最小值(或者最大值)在朋友面前装逼堆属性堆分为两种:最大堆和最小堆,两者的差别在于节点的排序方......