Double-ended queue: a data structure with both stack and queue characteristics

It is planned to add the double-ended queue to the teaching of artificial intelligence during the curriculum reform in 2021! ! !

Deque:

Double-ended queue (deque, full name double-ended queue), is a data structure with the properties of queues and stacks;
elements in a deque can be popped from both ends, and it restricts insertion and deletion operations at both ends of the table Proceed;
deque can be enqueued and dequeued at either end of the queue;

Diagram of deque:

Insert picture description here

Deque code structure (linked list implementation)
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()


Guess you like

Origin blog.csdn.net/qq_41475067/article/details/112723610