> 백엔드 개발 > 파이썬 튜토리얼 > Python 데이터 구조 및 알고리즘 학습 이중 종료 큐

Python 데이터 구조 및 알고리즘 학습 이중 종료 큐

WBOY
풀어 주다: 2022-04-01 12:09:29
앞으로
3017명이 탐색했습니다.

이 글에서는 이중 종료 큐의 기본 개념, 이중 종료 큐의 구현, 이중 종료 큐의 적용 등 이중 종료 큐와 관련된 문제를 주로 소개하는 python에 대한 관련 지식을 제공합니다. 모든 사람에게 도움이 되기를 바랍니다.

Python 데이터 구조 및 알고리즘 학습 이중 종료 큐

추천 학습: python 튜토리얼

0. 학습 목표

양단 큐는 또 다른 선형 데이터 구조입니다. 제한된 선형 테이블이지만 스택 및 큐와 달리 이중 끝형 큐에는 제한이 거의 없습니다. 기본 작업도 선형 테이블 작업의 하위 집합이지만 데이터 유형의 관점에서 볼 때 선형 테이블과 크게 다릅니다. 다른. 이 섹션에서는 이중 종단 큐의 정의와 다양한 구현을 소개하고 이중 종단 큐의 실제 적용 사례를 제공합니다.
이 섹션을 학습하면서 다음 내용을 마스터해야 합니다.

  • 이중 큐의 기본 개념 및 다양한 구현 방법
  • 이중 큐 기본 작업의 구현 및 시간 복잡도
  • 이중 큐의 기본 작업 사용 복잡한 알고리즘을 구현하기 위한 종료 큐

1. 이중 종료 큐의 기본 개념

1.1 이중 종료 큐의 기본 개념

이중 종료 큐(double-end queue , deque)도 삽입되고 삭제 작업은 각각 시퀀스의 양쪽 끝에 있는 선형 목록으로 제한되지만 스택 및 큐와 달리 이중 종료 큐에는 제한이 거의 없습니다. 대기열의 뒤쪽(rear) 및 대기열의 앞쪽(front)에서는 요소 삽입과 삭제가 모두 허용됩니다. 대기열의 헤드 또는 테일에 새 요소를 추가할 수 있습니다. 마찬가지로 양쪽 끝에서 기존 요소를 제거할 수 있습니다. 어떤 의미에서 양방향 큐는 스택과 큐의 조합으로 간주될 수 있습니다. double-end queue, deque) 也是插入和删除操作分别被限制在序列两端的线性表,但与栈和队列不同的是,Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的限制很少,对于Python 데이터 구조 및 알고리즘 학습 이중 종료 큐而言,队尾 (rear) 和队头 (front) 均允许插入元素和删除元素。新元素既可以被添加到队头, 也可以被添加到队尾。同理,已有的元素也能从任意一端移除。某种意义上,可以认为Python 데이터 구조 및 알고리즘 학습 이중 종료 큐是栈和队列的结合。

Python 데이터 구조 및 알고리즘 학습 이중 종료 큐

尽管Python 데이터 구조 및 알고리즘 학습 이중 종료 큐有栈和队列的很多特性,但是它并不要求按照这两种数据结构所限定的 LIFO 原则和 FIFO 原则操作元素。

1.2 Python 데이터 구조 및 알고리즘 학습 이중 종료 큐抽象数据类型

除了添加和移除元素外,Python 데이터 구조 및 알고리즘 학습 이중 종료 큐还具有初始化、判队空和求队长度等辅助操作。具体而言,Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的抽象数据类型定义如下:

 基本操作:
  1. __itit__(): 初始化Python 데이터 구조 및 알고리즘 학습 이중 종료 큐
   创建一个空Python 데이터 구조 및 알고리즘 학습 이중 종료 큐
  2. size(): 求取并返回Python 데이터 구조 및 알고리즘 학습 이중 종료 큐中所含元素的个数 n
   若Python 데이터 구조 및 알고리즘 학습 이중 종료 큐为空,则返回整数0
  3. isempty(): 判断是否为空Python 데이터 구조 및 알고리즘 학습 이중 종료 큐
   判断Python 데이터 구조 및 알고리즘 학습 이중 종료 큐中是否存储元素
  4. addfront(data): Python 데이터 구조 및 알고리즘 학습 이중 종료 큐队头添加元素
   将元素 data 插入队头
  5. addrear(data): Python 데이터 구조 및 알고리즘 학습 이중 종료 큐队尾添加元素
   将元素 data 插入队尾
  6. removefront(): 删除Python 데이터 구조 및 알고리즘 학습 이중 종료 큐队头元素
   删除并返回队头元素
  7. removerear(): 删除Python 데이터 구조 및 알고리즘 학습 이중 종료 큐队尾元素
   删除并返回队尾元素

2. Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的实现

和普通队列一样,Python 데이터 구조 및 알고리즘 학습 이중 종료 큐同样有顺序存储和链式存储两种存储表示方式。

2.1 顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的实现

类似于顺序队列,Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的顺序存储结构利用一组地址连续的存储单元依次存放从Python 데이터 구조 및 알고리즘 학습 이중 종료 큐头到Python 데이터 구조 및 알고리즘 학습 이중 종료 큐尾的元素,同时需要用两个指针 frontrear 分别指示队列头元素和队列尾元素的位置。初始化空Python 데이터 구조 및 알고리즘 학습 이중 종료 큐时,front=rear=0,当元素入队时,rear 加 1,而元素出队时,front 加 1,同时为了重复利用空闲空间,我们将顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐假设尾环状空间,最后一个空间和第一个空间视为连续空间(具体原因参考):

Python 데이터 구조 및 알고리즘 학습 이중 종료 큐

同样顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐可以是固定长度和动态长度,当Python 데이터 구조 및 알고리즘 학습 이중 종료 큐满时,定长顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐会抛出Python 데이터 구조 및 알고리즘 학습 이중 종료 큐满异常,动态顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐则会动态申请空闲空间。

2.1.1 Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的初始化

顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的初始化需要 4 部分信息:deque 列表用于存储数据元素,max_size 用于存储 queue 列表的最大长度,以及 frontrear

Double-ended queue🎜🎜deque에는 스택과 큐가 있지만 이 두 데이터 구조에 의해 정의된 LIFO 원칙과 FIFO 원칙에 따른 작동 요소가 필요하지 않습니다. 🎜🎜🎜1.2 이중 종단 큐 추상 데이터 유형🎜🎜🎜양단 큐에는 요소 추가 및 제거 외에도 초기화, 큐 비어 있음 판단 및 큐 길이와 같은 보조 작업도 있습니다. 구체적으로, 이중 종료 대기열의 추상 데이터 유형은 다음과 같이 정의됩니다. 🎜
🎜 기본 작업: 🎜 ~ 1. __itit__(): deque 초기화 🎜 ~ 빈 deque 만들기 🎜 ~ 2. size(): 공용체 찾기 이중 종단 큐에 포함된 요소 수 n을 반환합니다. 이중 종단 큐가 비어 있으면 정수 0이 반환됩니다. isempty(): addfront(data)가 비어 있는지 확인합니다. : 이중 종료 큐의 헤드에 요소 추가 🎜 ~~ 큐의 맨 앞에 요소 데이터 삽입 🎜 ~ 5. addrear(data): 이중 종료 큐의 끝에 요소 추가 🎜 ~ ~~ 요소 데이터 삽입 🎜 ~ 6. Removefront(): 이중 종료 큐 제거 끝 큐의 헤드 요소 🎜      큐의 헤드 요소를 삭제하고 반환 🎜   7. Removerear(): 이중 종료 큐의 후면 요소 삭제 -종료 큐 🎜     이중 종단 큐의 뒷부분 삭제 및 반환 🎜
🎜 2. 이중 종단 큐 🎜🎜 및 일반 구현 큐와 마찬가지로 이중 종단 큐에도 두 가지 저장 표현이 있습니다: 순차 저장 및 체인 스토리지. 🎜🎜🎜2.1 순차 이중 종단 큐 구현🎜🎜🎜순차 큐와 유사하게 이중 종단 큐의 순차 저장 구조는 연속 주소를 가진 저장 단위 세트를 사용하여 이중 종단 큐의 선두부터 요소를 저장합니다. 두 개의 포인터 frontrear를 사용하여 큐 헤드 요소와 큐 테일 요소의 위치를 ​​각각 나타냅니다. 빈 양면 큐 front=rear=0를 초기화할 때, 큐에 요소가 추가되면 rear가 1씩 증가하고, 요소가 큐에서 제거되면 , front를 1만큼 증가 /code>하고 여유 공간을 재사용하기 위해 순차 이중 끝 큐에 테일 링 공간이 있고 마지막 공간과 첫 번째 공간은 연속적인 공간으로 간주한다고 가정합니다. (특정한 이유는 을 참조하세요.): 🎜🎜🎜🎜비슷한 순차 이중 종단 큐는 고정 길이와 동적 길이가 될 수 있습니다. 이중 종단 큐가 가득 차면 고정 길이 순차 이중 종단 큐는 이중 종단 큐 전체 예외를 발생시킵니다. 동적 순차 이중 종료 큐는 여유 공간을 동적으로 적용합니다. 🎜<h4>🎜2.1.1 이중 종료 큐 초기화🎜</h4>🎜순차 이중 종료 큐의 초기화에는 4가지 정보가 필요합니다. <code>deque 목록은 데이터 요소를 저장하는 데 사용됩니다. code>max_size는 queue 목록의 최대 길이를 저장하는 데 사용되며 frontrear는 인덱스를 기록하는 데 사용됩니다. 머리 요소와 꼬리 요소 각각 :🎜
class Deque:
    def __init__(self, max_size=6):
        self.max_size = max_size
        self.deque = [None] * self.max_size
        self.front = 0
        self.rear = 0
로그인 후 복사

2.1.2 이중 끝 큐의 길이를 구하세요

frontrear는 head 요소와 tail 요소의 인덱스를 기록하는 데 사용되기 때문입니다 각각, 우리는 이중 종단 큐의 길이를 동시에 편리하게 계산할 수 있습니다. 우리는 이중 종단 큐가 순환 큐이고 front보다 클 수 있다는 점을 고려해야 합니다. Rear이며 rear-frontcode>를 통해 직접 전달할 수 없으므로 이 문제를 해결하려면 수식 계산을 사용해야 합니다.
frontrear 分别用于记录队头元素和队尾元素的索引,因此我们可以方便的计算出Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的长度;同时我们需要考虑Python 데이터 구조 및 알고리즘 학습 이중 종료 큐为Python 데이터 구조 및 알고리즘 학습 이중 종료 큐,front 可能大于 rear,不能直接通过 rear-front,我们需要利用公式计算解决此问题:

Python 实现如下:

    def size(self):
        return (self.rear-self.front+self.max_size) % self.max_size
로그인 후 복사

2.1.3 判Python 데이터 구조 및 알고리즘 학습 이중 종료 큐空

根据 frontrear 的值可以方便的判断Python 데이터 구조 및 알고리즘 학습 이중 종료 큐是否为空:

    def isempty(self):
        return self.rear==self.front
로그인 후 복사

2.1.4 判Python 데이터 구조 및 알고리즘 학습 이중 종료 큐满

根据 frontrear 的值可以方便的判断Python 데이터 구조 및 알고리즘 학습 이중 종료 큐是否还有空余空间:

    def isfull(self):
        return ((self.rear+1) % self.max_size == self.front)
로그인 후 복사

2.1.5 Python 데이터 구조 및 알고리즘 학습 이중 종료 큐队头和队尾添加元素

添加元素时,需要首先判断Python 데이터 구조 및 알고리즘 학습 이중 종료 큐中是否还有空闲空间,然后根据Python 데이터 구조 및 알고리즘 학습 이중 종료 큐为定长顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐或动态顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐,添加元素操作稍有不同:
[定长顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的添加元素操作] 如果队满,则引发异常:

    # 注意队头和队尾修改索引的添加元素的不同顺序
    def addrear(self, data):
        if not self.isfull():
            self.deque[self.rear] = data
            self.rear = (self.rear+1) % self.max_size        else:
            raise IndexError("Full Deque Exception")
    
    def addfront(self, data):
        if self.isfull():
            self.resize()
        if self.isempty():
            # 当Python 데이터 구조 및 알고리즘 학습 이중 종료 큐
            self.deque[self.rear] = data
            self.rear = (self.rear+1) % self.max_size        else:
            self.front = (self.front - 1 + self.max_size) % self.max_size
            self.deque[self.front] = data
로그인 후 복사

[动态顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的添加元素操作] 如果Python 데이터 구조 및 알고리즘 학습 이중 종료 큐满,则首先申请新空间,然后再执行添加操作:

    def resize(self):
        new_size = 2 * self.max_size
        new_deque = [None] * new_size
        d = new_size - self.max_size        for i in range(self.max_size):
            new_deque[(self.front+i+d) % new_size] = self.deque[(self.front+i) % self.max_size]
        self.deque = new_deque
        self.front = (self.front+d) % new_size
        self.max_size = new_size        
    # 注意队头和队尾修改索引的添加元素的不同顺序
    def addrear(self, data):
        if self.isfull():
            self.resize()
        self.deque[self.rear] = data
        self.rear = (self.rear+1) % self.max_size    def addfront(self, data):
        if self.isfull():
            self.resize()
        self.front = (self.front - 1 + self.max_size) % self.max_size
        self.deque[self.front] = data
로그인 후 복사

与动态顺序队列类似,我们同样需要考虑复制之后的索引,否则可能出现存在不能用的空闲空间:

Python 데이터 구조 및 알고리즘 학습 이중 종료 큐

添加元素的时间复杂度为O(1)。虽然当动态顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐满时,原Python 데이터 구조 및 알고리즘 학습 이중 종료 큐中的元素需要首先复制到新Python 데이터 구조 및 알고리즘 학습 이중 종료 큐中,然后添加新元素,但参考《顺序表及其操作实现》中顺序表追加操作的介绍,由于 n 次添加元素操作的总时间T(n)O(n) 成正比,因此其摊销时间复杂度可以认为O(1)

2.1.6 删除队头或队尾的元素

若Python 데이터 구조 및 알고리즘 학습 이중 종료 큐不空,则删除并返回指定端元素:

    # 注意队头和队尾修改索引的删除元素的不同顺序
    def removefront(self):
        if not self.isempty():
            result = self.deque[self.front]
            self.front = (self.front+1) % self.max_size            return result        else:
            raise IndexError("Empty Deque Exception")
    
    def removerear(self):
        if not self.isempty():
            self.rear = (self.rear - 1 + self.max_size) % self.max_size
            result = self.deque[self.rear]
            return result        else:
            raise IndexError("Empty Deque Exception")
로그인 후 복사

2.2 链Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的实现

Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的另一种存储表示方式是使用链式存储结构,因此也常称为链Python 데이터 구조 및 알고리즘 학습 이중 종료 큐,其中 addfront 操作和 addrear 操作分别是通过在链表头部和尾部插入元素来实现的,而 removefront 操作和 removerear 操作分别是通过从头部和尾部删除结点来实现的。为了降低在尾部删除结点的时间复杂度,接下来基于双向链表实现Python 데이터 구조 및 알고리즘 학습 이중 종료 큐。

链Python 데이터 구조 및 알고리즘 학습 이중 종료 큐

2.2.1 Python 데이터 구조 및 알고리즘 학습 이중 종료 큐结点

Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的结点实现与双向链表并无差别:

class Node:
    def __init__(self, data=None):
        self.data = data
        self.next = None
    def __str__(self):
        return str(self.data)
로그인 후 복사

2.2.2 Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的初始化

Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的初始化函数中,使其队头指针 front 和队尾指针 rear 均指向 None,并初始化Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度:

class Deque:
    def __init__(self):
        self.front = None
        self.rear = None
        self.num = 0
로그인 후 복사

2.2.3 求Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度

返回 num 的值用于求取Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的长度,如果没有 num 属性,则需要遍历整个链表才能得到Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度:

    def size(self):
        return self.num
로그인 후 복사

2.2.4 判Python 데이터 구조 및 알고리즘 학습 이중 종료 큐空

根据Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的长度可以很容易的判断其是否为空Python 데이터 구조 및 알고리즘 학습 이중 종료 큐:

    def isempty(self):
        return self.num <h4>2.2.5 添加元素</h4><p>Python 데이터 구조 및 알고리즘 학습 이중 종료 큐添加元素时,可以在队尾或队头插入新元素,因此需要修改 <code>rear</code> 和 <code>front</code> 指针,并且同时也要修改结点的 <code>next</code> 和 <code>previous</code></p><code>Python</code>은 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">    def addrear(self, data):
        node = Node(data)
        # 如果添加元素前Python 데이터 구조 및 알고리즘 학습 이중 종료 큐为空,则添加结点时,需要将front指针也指向该结点
        if self.front is None:
            self.rear = node
            self.front = node        else:
            node.previous = self.rear
            self.rear.next = node
            self.rear = node
        self.num += 1
    
    def addfront(self, data):
        node = Node(data)
        # 如果添加元素前Python 데이터 구조 및 알고리즘 학습 이중 종료 큐为空,则添加结点时,需要将rear指针也指向该结点
        if self.rear is None:
            self.front = node
            self.rear = node        else:
            node.next = self.front
            self.front.previous = node
            self.front = node
        self.num += 1
로그인 후 복사
로그인 후 복사
🎜🎜2.1.3 front 및 <code>rear의 값을 쉽게 확인할 수 있습니다. 이중 종료 큐가 비어 있는지 여부: 🎜
    def removefront(self):
        if self.isempty():
            raise IndexError("Empty Queue Exception")
        result = self.front.data
        self.front = self.front.next
        self.num -= 1
        if self.isempty():
            self.rear = self.front        else:
            # 若删除操作完成后,Python 데이터 구조 및 알고리즘 학습 이중 종료 큐不为空,将 front 指针的前驱指针指向 None
            self.front.previous = None
        return result    
    def removerear(self):
        if self.isempty():
            raise IndexError("Empty Queue Exception")
        result = self.rear.data
        self.rear = self.rear.previous
        self.num -= 1
        if self.isempty():
            self.front = self.rear        else:
            # 若删除操作完成后,Python 데이터 구조 및 알고리즘 학습 이중 종료 큐不为空,将 rear 指针的后继指针指向 None
            self.rear.next = None
        return result
로그인 후 복사
로그인 후 복사
🎜🎜2.1.4 frontrear 값에 따라 이중 종료 큐가 가득 찼는지 확인🎜🎜🎜 이중 종료 큐에 여유 공간이 있는지 쉽게 확인할 수 있습니다: 🎜
# 初始化一个最大长度为5的Python 데이터 구조 및 알고리즘 학습 이중 종료 큐dq = Deque(5)print('Python 데이터 구조 및 알고리즘 학습 이중 종료 큐空?', dq.isempty())for i in range(3):
    print('队头添加元素:', 2*i)
    dq.addfront(2*i)
    print('队尾添加元素:', 2*i+1)
    dq.addrear(2*i+1)print('Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为:', dq.size())for i in range(3):
    print('队尾删除元素:', dq.removerear())
    print('队头删除元素:', dq.removefront())print('Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为:', dq.size())
로그인 후 복사
로그인 후 복사
🎜2.1.5 이중 종료 큐의 머리와 꼬리에 요소를 추가하세요🎜🎜요소를 추가할 때 먼저 이중 종료 여부를 결정해야 합니다. 큐에 여유 공간이 있고, 이중 종단 큐가 고정 길이 순차 이중 종단 큐인지 동적 순차 이중 종단 큐인지에 따라 요소 추가 작업이 약간 다릅니다.
🎜 [고정 길이 순차 이중 종료 큐의 요소 추가 작업]🎜 큐가 가득 차면 예외가 발생합니다. 🎜
Python 데이터 구조 및 알고리즘 학습 이중 종료 큐空? True队头添加元素: 0队尾添加元素: 1队头添加元素: 2队尾添加元素: 3队头添加元素: 4队尾添加元素: 5Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为: 6队尾删除元素: 5队头删除元素: 4队尾删除元素: 3队头删除元素: 2队尾删除元素: 1队头删除元素: 0Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为: 0
로그인 후 복사
로그인 후 복사
🎜🎜[동적 시퀀스 deque의 요소 추가 작업]🎜 deque가 가득 차면 새 공간이 생성됩니다. 먼저 적용한 다음 추가 작업을 수행합니다. 🎜
# 初始化新队列dq = Deque()print('Python 데이터 구조 및 알고리즘 학습 이중 종료 큐空?', dq.isempty())for i in range(3):
    print('队头添加元素:', i)
    dq.addfront(2*i)
    print('队尾添加元素:', i+3)
    dq.addrear(2*i+1)print('Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为:', dq.size())for i in range(3):
    print('队尾删除元素:', dq.removerear())
    print('队头删除元素:', dq.removefront())print('Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为:', dq.size())
로그인 후 복사
로그인 후 복사
🎜동적 시퀀스 사용 대기열도 비슷합니다. 복사한 후 인덱스도 고려해야 합니다. 그렇지 않으면 사용할 수 없는 여유 공간이 있을 수 있습니다. 🎜🎜확장 전후 포인터 인덱스 변경🎜🎜요소 추가의 시간 복잡도는O( 1). 동적 순차 더블 엔드 큐가 가득 차면 원래 더블 엔드 큐의 요소를 먼저 새 더블 엔드 큐에 복사한 다음 새 요소를 추가해야 합니다. 그러나 순차 도입을 참조하세요. "시퀀스 테이블 및 해당 작업 구현"의 테이블 추가 작업, n 요소 추가 작업의 총 시간으로 인해T ( n)O(n) /span>은 ">O의 상각 시간 복잡도에 비례합니다. span>(1)스팬>. 🎜🎜🎜2.1.6 대기열의 머리 또는 꼬리에 있는 요소를 삭제합니다🎜🎜🎜이중 종료 대기열이 비어 있지 않으면 삭제하고 지정된 끝 요소를 반환합니다. 🎜
Python 데이터 구조 및 알고리즘 학습 이중 종료 큐空? True队头添加元素: 0队尾添加元素: 3队头添加元素: 1队尾添加元素: 4队头添加元素: 2队尾添加元素: 5Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为: 6队尾删除元素: 5队头删除元素: 4队尾删除元素: 3队头删除元素: 2队尾删除元素: 1队头删除元素: 0Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为: 0
로그인 후 복사
로그인 후 복사

🎜2.2 체인 이중 구현 종료 대기열🎜

🎜이중 종료 대기열의 또 다른 저장 표현은 체인 저장 구조를 사용하는 것이므로 종종 체인 이중 종료 대기열이라고도 합니다. 여기서 addfront 작업과 addrear 작업은 각각 연결 목록의 머리 부분과 끝 부분에 요소를 삽입하여 수행되며, removefrontremoverear 작업은 구현됩니다. 머리와 꼬리에서 각각 노드를 삭제합니다. tail에서 노드를 삭제하는 시간 복잡도를 줄이기 위해 이중 연결 목록을 기반으로 이중 종료 큐를 구현합니다. 🎜🎜체인 더블 엔드 큐🎜🎜2.2.1 더블 종료 대기열 노드 🎜🎜이중 종료 대기열의 노드 구현은 이중 연결 목록의 노드 구현과 다르지 않습니다. 🎜
def ispalindrome(string):
    deque = Deque()
    for ch in string:
        deque.addfront(ch)
    flag = True
    while deque.size() > 1 and flag:
        ch1 = deque.removefront()
        ch2 = deque.removerear()
        if ch1 != ch2:
            flag = False
    return flag
로그인 후 복사
로그인 후 복사
🎜2.2.2 이중 종료 대기열의 초기화🎜🎜이중 종료 대기열의 초기화 기능에서 큐의 헤드 포인터 front와 큐 꼬리 포인터 rear는 모두 None을 가리키도록 설정하고 양방향 큐의 길이를 초기화합니다. 🎜
print('abcba是否为回文序列:', ispalindrome('abcba'))print('charaahc是否为回文序列:', ispalindrome('charaahc'))
로그인 후 복사
로그인 후 복사
🎜2.2.3 이중 종료 큐의 길이 찾기🎜🎜return num 값은 이중 종료 큐의 길이를 찾는 데 사용됩니다. 속성, 이중 종료 큐의 길이를 얻으려면 전체 연결 목록을 순회해야 합니다. 🎜
abcba是否为回文序列: True
charaahc是否为回文序列: False
로그인 후 복사
로그인 후 복사
🎜2.2.4 이중 종료 확인 큐가 비어 있는지🎜🎜 비어 있는지 쉽게 판단할 수 있습니다. 이중 종료 큐의 길이에 따라:🎜rrreee🎜2.2.5 요소 추가🎜🎜양단 큐에 요소를 추가할 때 큐의 끝이나 헤드에 새 요소를 삽입할 수 있으므로 후면전면 포인터를 수정해야 하며 노드의 다음이전 포인터도 동시에 수정해야 합니다. 시간; 요소를 추가하기 전에 이중 종료 대기열이 비어 있으면 그에 따라 처리해야 합니다. 🎜
    def addrear(self, data):
        node = Node(data)
        # 如果添加元素前Python 데이터 구조 및 알고리즘 학습 이중 종료 큐为空,则添加结点时,需要将front指针也指向该结点
        if self.front is None:
            self.rear = node
            self.front = node        else:
            node.previous = self.rear
            self.rear.next = node
            self.rear = node
        self.num += 1
    
    def addfront(self, data):
        node = Node(data)
        # 如果添加元素前Python 데이터 구조 및 알고리즘 학습 이중 종료 큐为空,则添加结点时,需要将rear指针也指向该结点
        if self.rear is None:
            self.front = node
            self.rear = node        else:
            node.next = self.front
            self.front.previous = node
            self.front = node
        self.num += 1
로그인 후 복사

2.2.6 删除元素

若Python 데이터 구조 및 알고리즘 학습 이중 종료 큐不空,可以从删除队头或队尾元素并返回,删除操作需要更新队头指针 front 以及尾指针 rear,同时也要修改结点的 nextprevious 指针,若出队元素尾队中最后一个结点,还需要进行相应处理:

    def removefront(self):
        if self.isempty():
            raise IndexError("Empty Queue Exception")
        result = self.front.data
        self.front = self.front.next
        self.num -= 1
        if self.isempty():
            self.rear = self.front        else:
            # 若删除操作完成后,Python 데이터 구조 및 알고리즘 학습 이중 종료 큐不为空,将 front 指针的前驱指针指向 None
            self.front.previous = None
        return result    
    def removerear(self):
        if self.isempty():
            raise IndexError("Empty Queue Exception")
        result = self.rear.data
        self.rear = self.rear.previous
        self.num -= 1
        if self.isempty():
            self.front = self.rear        else:
            # 若删除操作完成后,Python 데이터 구조 및 알고리즘 학습 이중 종료 큐不为空,将 rear 指针的后继指针指向 None
            self.rear.next = None
        return result
로그인 후 복사
로그인 후 복사

2.3 Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的不同实现对比

Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的不同实现对比与栈的不同实现类似,可以参考《栈及其操作实现》。

3. Python 데이터 구조 및 알고리즘 학습 이중 종료 큐应用

接下来,我们首先测试上述实现的Python 데이터 구조 및 알고리즘 학습 이중 종료 큐,以验证操作的有效性,然后利用实现的基本操作来解决实际算法问题。

3.1 顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的应用

首先初始化一个顺序Python 데이터 구조 및 알고리즘 학습 이중 종료 큐 deque,然后测试相关操作:

# 初始化一个最大长度为5的Python 데이터 구조 및 알고리즘 학습 이중 종료 큐dq = Deque(5)print('Python 데이터 구조 및 알고리즘 학습 이중 종료 큐空?', dq.isempty())for i in range(3):
    print('队头添加元素:', 2*i)
    dq.addfront(2*i)
    print('队尾添加元素:', 2*i+1)
    dq.addrear(2*i+1)print('Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为:', dq.size())for i in range(3):
    print('队尾删除元素:', dq.removerear())
    print('队头删除元素:', dq.removefront())print('Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为:', dq.size())
로그인 후 복사
로그인 후 복사

测试程序输出结果如下:

Python 데이터 구조 및 알고리즘 학습 이중 종료 큐空? True队头添加元素: 0队尾添加元素: 1队头添加元素: 2队尾添加元素: 3队头添加元素: 4队尾添加元素: 5Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为: 6队尾删除元素: 5队头删除元素: 4队尾删除元素: 3队头删除元素: 2队尾删除元素: 1队头删除元素: 0Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为: 0
로그인 후 복사
로그인 후 복사

3.2 链Python 데이터 구조 및 알고리즘 학습 이중 종료 큐的应用

首先初始化一个链Python 데이터 구조 및 알고리즘 학습 이중 종료 큐 queue,然后测试相关操作:

# 初始化新队列dq = Deque()print('Python 데이터 구조 및 알고리즘 학습 이중 종료 큐空?', dq.isempty())for i in range(3):
    print('队头添加元素:', i)
    dq.addfront(2*i)
    print('队尾添加元素:', i+3)
    dq.addrear(2*i+1)print('Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为:', dq.size())for i in range(3):
    print('队尾删除元素:', dq.removerear())
    print('队头删除元素:', dq.removefront())print('Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为:', dq.size())
로그인 후 복사
로그인 후 복사

测试程序输出结果如下:

Python 데이터 구조 및 알고리즘 학습 이중 종료 큐空? True队头添加元素: 0队尾添加元素: 3队头添加元素: 1队尾添加元素: 4队头添加元素: 2队尾添加元素: 5Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为: 6队尾删除元素: 5队头删除元素: 4队尾删除元素: 3队头删除元素: 2队尾删除元素: 1队头删除元素: 0Python 데이터 구조 및 알고리즘 학습 이중 종료 큐长度为: 0
로그인 후 복사
로그인 후 복사

3.3 利用Python 데이터 구조 및 알고리즘 학습 이중 종료 큐基本操作实现复杂算法

[1] 给定一字符串 string (如:abamaba),检查其是否为回文。

使用Python 데이터 구조 및 알고리즘 학습 이중 종료 큐可以快速检查一字符串是否为回文序列,只需要将字符串中字符依次入队,然后从Python 데이터 구조 및 알고리즘 학습 이중 종료 큐两端依次弹出元素,对比它们是否相等:

def ispalindrome(string):
    deque = Deque()
    for ch in string:
        deque.addfront(ch)
    flag = True
    while deque.size() > 1 and flag:
        ch1 = deque.removefront()
        ch2 = deque.removerear()
        if ch1 != ch2:
            flag = False
    return flag
로그인 후 복사
로그인 후 복사

验证算法有效性:

print('abcba是否为回文序列:', ispalindrome('abcba'))print('charaahc是否为回文序列:', ispalindrome('charaahc'))
로그인 후 복사
로그인 후 복사

结果输出如下:

abcba是否为回文序列: True
charaahc是否为回文序列: False
로그인 후 복사
로그인 후 복사

推荐学习:python教程

위 내용은 Python 데이터 구조 및 알고리즘 학습 이중 종료 큐의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿