両端キュー:スタックとキューの両方の特性を備えたデータ構造

2021年のカリキュラム改革の際に、人工知能の教育に両端キューを追加する予定です。

Deque:

両端キュー(deque、フルネームの両端キュー)は、キューとスタックのプロパティを持つデータ構造です。dequeの
要素は両端からポップでき、両端での挿入操作と削除操作を制限します。 table Proceed;
dequeはキューの両端でエンキューおよびデキューできます。

dequeの図:

ここに写真の説明を挿入

Dequeコード構造(リンクリストの実装)
class Node(object):
    """结点类"""
    def __init__(self, item):
        """实例属性初始化和赋值"""
        self.item = item
        self.next = None


class Queue(object):
    def __init__(self, head=None, end=None):
        # 初始化头结点游标指针
        self.head = head
        # 初始化尾结点游标指针
        self.end = end

    def add(self, item):
        """头部添加"""
        # 实例化一个新结点
        node = Node(item)
        # 头结点存在情况
        if self.head:
            cur = self.head
            node.next = cur
            self.head = node
        # 头结点不存在的情况
        else:
            self.head = node
            self.end = node

    def append(self, item):
        """尾部添加"""
        # 实例化一个新结点
        node = Node(item)
        # 尾结点存在情况
        if self.end:
            # 直接调整尾结点next指针指向新节点
            cur = self.end
            cur.next = node
            self.end = node
        # 尾结点不存的情况
        else:
            self.head = node
            self.end = node

    def head_remove(self):
        """头部删除"""
        # 头结点存在的情况
        if self.head:
            # 保存头结点
            cur = self.head
            # 判断是不是孤立结点
            # 如果不是孤立结点,正常删除
            if cur.next is not None:
                node = cur.next
                self.head = node
            # 如果是孤立结点,则头结点指向None,就代表删除成功
            else:
                self.head = None
        return

    def end_remove(self):
        """尾部删除"""
        # 判断尾结点是否存在
        # 存在的情况
        if self.end:
            # 创建两个临时游标节后头结点和None对象
            cur = self.head
            pro = None
            # 构造查找尾结点的循环条件
            while cur.next is not None:
                # 循环内部,两个游标正常移动并赋值
                pro = cur
                cur = cur.next
            # 循环终止,说明cur已经定位到尾节点,如果要删除尾结点
            # 只需要让前面的pro节点指向为None即可
            pro.next = None
        return

    def treavl(self):
        # 空链表情况
        if self.head is None:
            return
        # 不为空链表的情况
        cur = self.head
        # 构造从头结点循环到尾结点的条件
        while cur is not None:
            # 打印节点元素
            print(cur.item)
            # 移动游标
            cur = cur.next
        return


if __name__ == '__main__':
    q = Queue()
    q.add(1)
    q.add(2)
    q.append(3)
    q.append(4)
    q.append(5)
    q.treavl()
    print("---------------------")
    q.head_remove()
    q.end_remove()
    q.treavl()


おすすめ

転載: blog.csdn.net/qq_41475067/article/details/112723610