数据结构-3(双向链表、循环链表、栈、队列)

发布于:2025-07-19 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、思维导图

二、双向循环链表的判空、尾插、遍历(反向)、尾删

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
        self.prior = None


class circularDoublyLinkedList():
    def __init__(self):
        self.head = None
        self.tail = None
        self.size = 0

    def isEmpty(self):
        return self.size == 0

    def add_tail(self, data):
        node = Node(data)
        if self.isEmpty():
            self.head = node  #
            node.next = node  # 循环链表特性
            node.prior = None  # 双向链表特性(该行可有可无)
            self.size += 1
        else:
            i = 1
            q = self.head
            while i < self.size:  # 找到最后一个节点
                q = q.next
                i += 1
            node.prior = q # 双向链表
            node.next = self.head # 循环链表
            self.head.prior = node # 双向链表
            q.next = node

            self.size += 1

    def show(self):
        if self.isEmpty():
            print("遍历西巴")
            return
        else:
            q = self.head.prior
            while q != self.head:
                print(f"{q.data}", end="<--")
                q = q.prior
            print(f"{q.data}", end="<--")  # 此时已经到了尾部,但尾部节点直接跳出了循环没有打印,这里补上
            print()

    def delete_tail(self):
        if self.isEmpty():
            print("无需删除")
            return
        else:
            q = self.head
            i = 1
            while i < self.size-1:
                q = q.next
                i += 1
            q.next = self.head
            self.head.prior = q
            self.size-=1


if __name__ == '__main__':
    linked_list = circularDoublyLinkedList()
    linked_list.add_tail(1)
    linked_list.add_tail(2)
    linked_list.add_tail(3)
    linked_list.add_tail(4)
    linked_list.show()
    linked_list.delete_tail()
    linked_list.show()
    linked_list.delete_tail()
    linked_list.show()
    linked_list.delete_tail()
    linked_list.show()
    linked_list.delete_tail()
    linked_list.delete_tail()
    linked_list.show()

三、顺序栈


class Stack:
    def __init__(self, capacity=10):
        self.data = [None] * capacity
        self.size = 0
        self.capacity = capacity  # 最大容量

    def isEmpty(self):
        return self.size == 0
    def isFull(self):
        return self.size == self.capacity
    def push(self, value):
        if self.isFull():
            print("stack is full")
            return False
        else:
            i = self.size - 1
            while i >= 0:
                self.data[i + 1] = self.data[i]
                i -= 1
            self.data[0] = value
            self.size+=1

    def pop(self):
        if self.isEmpty():
            print("stack is empty")
            return None
        else:
            i = 0
            while i < self.size-1:
                self.data[i] = self.data[i+1]
                i+=1
            self.data[self.size-1] = None
            self.size-=1
    def expend(self):
        print("扩容")
        self.capacity = int(self.capacity * 1.5)  # 定义扩容量
        print(f"新容量为:{int(self.capacity)}")
        self.backup_data = self.data
        self.data = [None] * int(self.capacity)  # 重置并扩容
        for i in range(self.size):  # 将备份好的列表逐步加入回重置并扩容后的列表
            self.data[i] = self.backup_data[i]
    def show(self):
        if self.isEmpty():
            print("数据表为空")
            return
        else:
            i = 0
            while i < self.size:
                print(self.data[i],end=" ")
                i+=1
            print()
    def first_value(self):
        return self.data[0]

if __name__ == '__main__':
    stack = Stack()
    stack.push(1)
    stack.push(2)
    stack.push(3)
    stack.push(4)
    stack.show()
    print("first_value is ------>",stack.first_value())
    stack.pop()
    stack.show()
    stack.pop()
    stack.show()
    stack.pop()
    stack.show()
    stack.pop()
    stack.pop()
    stack.show()

四、链式栈

class Node():
    def __init__(self, data):
        self.data = data
        self.next = None


class Linked_Stack():
    def __init__(self):
        self.size = 0
        self.head = None


    def isEmpty(self):
        return self.size == 0

    def push(self, data):
        node = Node(data)
        if self.isEmpty():
            self.head = node
            self.size += 1
        else:
            node.next = self.head
            self.head = node
            self.size += 1

    def pop(self):
        if self.isEmpty():
            print("Stack is Empty")
        else:
            self.head = self.head.next
            self.size -= 1

    def first_value(self):
        return self.head

    def show(self):
        if self.isEmpty():
            return
        else:
            q = self.head
            while q:
                print(q.data, end="-->")
                q = q.next
            print()

if __name__ == '__main__':
    link_stack = Linked_Stack()
    link_stack.push(1)
    link_stack.show()
    link_stack.push(2)
    link_stack.push(3)
    link_stack.show()
    link_stack.pop()
    link_stack.show()
    link_stack.pop()
    link_stack.show()
    link_stack.pop()
    link_stack.show()
    link_stack.pop()
    link_stack.show()

五、顺序队列

class Queue:
    def __init__(self, capacity=10):
        self.data = [None] * capacity
        self.size = 0
        self.capacity = capacity

    # 判空
    def isEmpty(self):
        return self.size == 0

    # 入队
    def push(self, data):
        i = self.size - 1
        while i >= 0:
            self.data[i + 1] = self.data[i]
            i -= 1
        self.data[0] = data
        self.size += 1

    def pop(self):
        if self.isEmpty():
            print("Queue is empty")
            return None
        else:
            self.data[self.size - 1] = None
            self.size -= 1

    # 遍历
    def show(self):
        if self.isEmpty():
            print("数据表为空")
            return
        else:
            i = 0
            while i < self.size:
                print(self.data[i], end=" ")
                i += 1
            print()


if __name__ == '__main__':
    queue = Queue()
    queue.push(1)
    queue.show()
    queue.push(2)
    queue.show()
    queue.push(3)
    queue.show()
    queue.push(4)
    queue.show()

    queue.pop()
    queue.show()
    queue.pop()
    queue.show()
    queue.pop()
    queue.show()
    queue.pop()
    queue.pop()
    queue.show()


网站公告

今日签到

点亮在社区的每一天
去签到