双向链表、循环链表、栈

embedded/2024/11/28 1:41:24/

双向循环链表

python">class Node:#显性定义出构造函数def __init__(self,data):self.data = data #普通节点的数据域self.next = None #保存下一个节点的链接域self.prior = None #保存前一个节点饿链接域
class DoubleLinkLoop:def __init__(self, node = Node):self.head = nodeself.size = 0# 判空def is_empty(self):return self.size == 0# 尾插def add_tail(self,data):node = Node(data)# 判空if self.is_empty():self.head = nodenode.next = nodenode.prior = nodeelse:q = self.headwhile q.next != self.head:q = q.nextq.next = nodenode.prioe = qnode.next = self.headself.head.prior = nodeself.size += 1# 遍历def show(self):if self.is_empty():print("链表为空,无法遍历")returnq = self.headwhile True:print(q.data, end=" ")q = q.nextif q == self.head:  # 遇到头节点结束循环breakprint()# 尾删def del_tial(self):if self.is_empty():print("删除失败")returnelse:if self.size == 1:self.head = Noneelse:q = self.headi = 1while i < self.size - 1:q = q.nexti += 1q.next = self.headself.head.prior = qself.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()

链式栈

python">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 Nonedef push(self, data):"""添加数据到栈顶"""new_node = Node(data)new_node.next = self.top  # 新节点指向当前栈顶self.top = new_node  # 更新栈顶为新节点self.size += 1def pop(self):"""弹出栈顶元素"""if self.is_empty():raise IndexError("pop from an empty stack")popped_data = self.top.dataself.top = self.top.next  # 栈顶指针下移self.size -= 1return popped_datadef peek(self):"""返回栈顶元素"""if self.is_empty():raise IndexError("peek from an empty stack")return self.top.datadef traverse(self):"""遍历栈中的所有元素"""elements = []current = self.topwhile current:elements.append(current.data)current = current.nextreturn elementsdef get_size(self):"""返回栈的大小"""return self.size

测试

python">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.ppmy.cn/embedded/141058.html

相关文章

关于“内网可以访问21端口,通过防火墙映射后无法访问”的问题解决

如果内网可以访问21端口&#xff0c;但通过防火墙映射后无法访问&#xff0c;这通常是因为防火墙或路由器的配置问题。以下是一些可能的解决方案和检查步骤&#xff1a; 1. 检查防火墙映射配置 确保你的防火墙或路由器已经正确配置了端口映射。通常&#xff0c;你需要将外部端…

使用minio cllient(mc)完成不同服务器的minio的数据迁移和mc基本操作

前言 最近需要将一个服务器上的minio桶的数据迁移到新服务器上,所以学习了一下,使用的是minio client。 MinIO Client (mc) 是一个用于与 MinIO 和其他兼容 Amazon S3 的云存储服务交互的命令行工具。MinIO 是一个高性能的对象存储服务器,mc 提供了一个丰富的命令集来管理对…

责任链模式在spring security过滤器链中的应用

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许多个对象按照顺序处理请求&#xff0c;并且每个对象可以选择自己是否处理该请求或将其传递给下一个对象。 在Spring Security中&#xff0c;责任链模式得到了广泛应…

如何用1分钟遍历一个100TB的文件?

如何用1分钟遍历一个100TB的文件? 标题:**极速挑战:1分钟内遍历100TB文件的秘籍**引言硬盘和文件系统基础硬盘类型文件系统原理RAID技术分布式文件系统HDFS架构实现1分钟内遍历100TB文件的策略技术细节和操作流程配置HDFS代码实现流程图案例分析结论标题:极速挑战:1分钟内…

Nodemailer使用教程:在Node.js中发送电子邮件

目录 1. 简介 2. 安装 3. 基本配置 3.1 创建传输器 3.2 配置说明 4. 发送邮件 4.1 基本发送示例 4.2 发送验证码示例 5. 常见问题解决 5.1 "Greeting never received" 错误 5.2 安全建议 SMTP与邮件加密协议详解 1. SMTP简介 1.1 基本特点 2. 加密协…

基于Matlab实现Gabo滤波器(源码)

Gabor滤波器是一种在图像处理和计算机视觉领域广泛应用的线性滤波器&#xff0c;它结合了空间局部性和频率选择性&#xff0c;能够较好地模拟人类视觉系统对图像特征的感知。在Matlab中实现Gabor滤波器&#xff0c;可以有效地提取图像的纹理、边缘和方向信息&#xff0c;对于图…

企业为什么选择服务器托管服务?

大多数的企业用户都会选择将自己的服务器进行托管服务&#xff0c;而不是放置在公司或者是办公地点&#xff0c;本文就来探讨一下企业为什么会选择服务器托管服务呢&#xff1f; 服务器与普通的计算机是不同的&#xff0c;需要保持每天24小时不间断工作&#xff0c;所以服务器需…

Linux firewalld 命令详解

简介 firewalld 是一个在 Linux 中的防火墙管理工具&#xff0c;提供动态接口管理网络流量&#xff0c;它使用区域来定义网络连接的信任级别&#xff0c;并支持 IPv4 和 IPv6。 常用示例 启动防火墙 sudo systemctl start firewalld停止防火墙 sudo systemctl stop firewa…