当前位置: 首页 > article >正文

双向链表、循环链表、栈

双向循环链表

class Node:
    #显性定义出构造函数
    def __init__(self,data):
        self.data = data #普通节点的数据域
        self.next = None #保存下一个节点的链接域
        self.prior = None #保存前一个节点饿链接域
class DoubleLinkLoop:
    def __init__(self, node = Node):
        self.head = node
        self.size = 0

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

    # 尾插
    def add_tail(self,data):
        node = Node(data)
        # 判空
        if self.is_empty():
            self.head = node
            node.next = node
            node.prior = node
        else:
            q = self.head
            while q.next != self.head:
                q = q.next

            q.next = node
            node.prioe = q
            node.next = self.head
            self.head.prior = node

        self.size += 1

    # 遍历
    def show(self):
        if self.is_empty():
            print("链表为空,无法遍历")
            return

        q = self.head
        while True:
            print(q.data, end=" ")
            q = q.next
            if q == self.head:  # 遇到头节点结束循环
                break
        print()

    # 尾删
    def del_tial(self):
        if self.is_empty():
            print("删除失败")
            return
        else:
            if self.size == 1:
                self.head = None
            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__":
    doubleLinkLoop = DoubleLinkLoop()

    # 尾插
    doubleLinkLoop.add_tail(10)
    doubleLinkLoop.add_tail(20)
    doubleLinkLoop.add_tail(30)
    doubleLinkLoop.add_tail(40)

    # 遍历
    doubleLinkLoop.show()

    # 尾删
    doubleLinkLoop.del_tial()
    doubleLinkLoop.show()



链式栈

class Node:
    """定义链式栈的节点"""
    def __init__(self, data=None):
        self.data = data  # 节点存储的数据
        self.next = None  # 指向下一个节点

class LinkedStack:
    """链式栈的实现"""
    def __init__(self):
        self.top = None  # 栈顶指针
        self.size = 0  # 栈的大小

    def is_empty(self):
        """判断栈是否为空"""
        return self.top is None

    def push(self, data):
        """添加数据到栈顶"""
        new_node = Node(data)
        new_node.next = self.top  # 新节点指向当前栈顶
        self.top = new_node  # 更新栈顶为新节点
        self.size += 1

    def pop(self):
        """弹出栈顶元素"""
        if self.is_empty():
            raise IndexError("pop from an empty stack")
        popped_data = self.top.data
        self.top = self.top.next  # 栈顶指针下移
        self.size -= 1
        return popped_data

    def peek(self):
        """返回栈顶元素"""
        if self.is_empty():
            raise IndexError("peek from an empty stack")
        return self.top.data

    def traverse(self):
        """遍历栈中的所有元素"""
        elements = []
        current = self.top
        while current:
            elements.append(current.data)
            current = current.next
        return elements

    def get_size(self):
        """返回栈的大小"""
        return self.size

测试

stack = LinkedStack()

# 添加数据
stack.push(10)
stack.push(20)
stack.push(30)

print("栈中的元素:", stack.traverse())  # 输出: [30, 20, 10]
print("栈顶元素:", stack.peek())  # 输出: 30
print("栈的大小:", stack.get_size())  # 输出: 3

# 弹出栈顶元素
print("弹出栈顶:", stack.pop())  # 输出: 30
print("栈中的元素:", stack.traverse())  # 输出: [20, 10]

# 判空
print("栈是否为空:", stack.is_empty())  # 输出: False

# 清空栈后判空
stack.pop()
stack.pop()
print("栈是否为空:", stack.is_empty())  # 输出: True

思维导图

 

 


http://www.kler.cn/a/412289.html

相关文章:

  • 观察者模式 (Observer Pattern)
  • uniapp的renderjs使用
  • 太速科技-512-基于ZU19EG的4路100G 8路40G的光纤汇流计算卡
  • 【青牛科技】D1671 75Ω 带4级低通滤波的单通道视频放大电 路芯片介绍
  • 常见线程安全问题之复合操作
  • 优化Docker镜像:提升部署效率与降低资源消耗
  • Docker desktop 改变存储位置
  • VUE练习
  • Hive的基础函数
  • 英语知识在线平台:Spring Boot技术探索
  • 流媒体拥塞控制与流控
  • 几个bev模型部署常用的命令
  • 深度学习每周学习总结J6(ResNeXt-50 算法实战与解析 - 猴痘识别)
  • Spring MVC练习(前后端分离开发实例)
  • Linux -线程互斥与同步
  • qt QDateTime详解
  • 【书生大模型实战营第四期】评测 InternLM-1.8B 实践
  • LSA详情与特殊区域
  • Pydantic 数据验证
  • 1- 9 C 语言面向对象
  • 差分 + 模拟,CF 815A - Karen and Game
  • 实现qt拖拽显示或者播放
  • linux 存储学习(nas)
  • 深入解析 MySQL 索引失效的原因与优化策略
  • 适合中小型公司的自动化测试的测试框架,OpenSourceTest
  • 最新 Blender 4.2 保姆级安装教程(附安装包)