Python----数据结构(栈:列表栈,链栈。初始化,入栈,出栈,获取栈长度,判断是否为空,访问栈顶元素)

embedded/2025/2/22 2:13:43/

一、栈

1.1、概念 

        栈(stack):又名堆栈,它是一种运算受限的线性表,是一种容器,可存入数据元素、访 问元素、删除元素,它的特点在于只能允许在容器的一端(成为栈顶top),进行存入数 据(push)和输出数据(pop)的运算,没有位置概念,保证任何时候都可以访问、删 除元素。栈仅允许在栈顶一端进行操作,因此,栈是按照先进后出(LIFO,Last In First Out)的原理进行运作。

 1.2、操作

栈使用两种基本操作:入栈(压栈,push) 和 出栈(弹栈,pop):

        入栈:将数据放入栈顶端

        出栈:将栈顶端数据移除

1.3、特点 

1.先入后出(FILO, First In Last Out),后入先出(LIFO, Last In First Out)

2.除头尾节点之外,每个元素有一个前驱,一个后继

二、顺序栈

2.1、初始化

python">    def __init__(self):  """初始化一个空栈,使用列表作为存储容器。"""  self.__list = []  

2.2、入栈

python">    def push(self, data):  """将数据压入栈中。  Args:  data: 要压入栈中的数据。  """  self.__list.append(data)  

2.3、出栈

python">    def pop(self):  """从栈中弹出数据。如果栈为空,打印提示信息。  Returns:  弹出的数据,如果栈为空则返回 None。  """  if self.is_empty():  print('空空如也')  # 栈为空,无法弹出数据  return None  # 返回 None,指示无数据可弹出  return self.__list.pop()  # 弹出栈顶元素并返回  

2.4、获取栈长度

python">    def size(self):  """返回栈中元素的数量。  Returns:  栈中元素的数量。  """  return self.__list.__len__()  # 返回栈的大小  

2.5、判断是否为空

python">    def is_empty(self):  """检查栈是否为空。  Returns:  如果栈为空返回 True,否则返回 False。  """  return self.__list == []  # 返回是否为真空栈  

2.6、访问栈顶元素

python">    def peek(self):  """查看栈顶数据但不弹出。如果栈为空,返回 None。  Returns:  栈顶的数据,如果栈为空则返回 None。  """  if self.__list:  return self.__list[-1]  # 返回栈顶元素  else:  return None  # 栈为空,返回 None  

2.7、完整代码

python">class Stack:  def __init__(self):  """初始化一个空栈,使用列表作为存储容器。"""  self.__list = []  def push(self, data):  """将数据压入栈中。  Args:  data: 要压入栈中的数据。  """  self.__list.append(data)  def pop(self):  """从栈中弹出数据。如果栈为空,打印提示信息。  Returns:  弹出的数据,如果栈为空则返回 None。  """  if self.is_empty():  print('空空如也')  # 栈为空,无法弹出数据  return None  # 返回 None,指示无数据可弹出  return self.__list.pop()  # 弹出栈顶元素并返回  def peek(self):  """查看栈顶数据但不弹出。如果栈为空,返回 None。  Returns:  栈顶的数据,如果栈为空则返回 None。  """  if self.__list:  return self.__list[-1]  # 返回栈顶元素  else:  return None  # 栈为空,返回 None  def is_empty(self):  """检查栈是否为空。  Returns:  如果栈为空返回 True,否则返回 False。  """  return self.__list == []  # 返回是否为真空栈  def size(self):  """返回栈中元素的数量。  Returns:  栈中元素的数量。  """  return self.__list.__len__()  # 返回栈的大小  if __name__ == '__main__':  a = Stack()  # 创建一个栈实例  a.push(10)   # 将 10 压入栈  a.push(20)   # 将 20 压入栈  a.push(30)   # 将 30 压入栈  a.push(40)   # 将 40 压入栈  a.push(50)   # 将 50 压入栈  print()   print(a.size())  # 打印栈的大小,应该输出 5  print(a.peek())  # 查看栈顶元素,应该输出 50

三、链栈

3.1、初始化

python">class Node:def __init__(self, data):"""初始化节点,包含数据和指向下一个节点的指针。Args:data: 节点存储的数据。"""self.data = dataself.next = None  # 初始时,节点的 next 指向 None
python">    def __init__(self):"""初始化一个空栈,使用头节点作为哨兵。"""self.head = Node(0)  # 哨兵节点,方便操作

3.2、入栈

python">    def push(self, data):"""将数据压入栈中。Args:data: 要压入栈中的数据。"""new_node = Node(data)  # 创建新节点new_node.next = self.head.next  # 新节点的 next 指向当前栈顶self.head.next = new_node  # 更新栈顶为新节点

3.3、出栈

python">    def pop(self):"""从栈中弹出数据。如果栈为空,打印提示信息。Returns:弹出的数据,如果栈为空则返回 None。"""if self.is_empty():print('空空如也')  # 栈为空,无法弹出数据return None  # 返回 None,指示无数据可弹出popped_data = self.head.next.data  # 获取栈顶元素self.head.next = self.head.next.next  # 移动栈顶指针到下一个节点return popped_data  # 返回弹出的数据

3.4、获取栈长度

python">    def size(self):"""返回栈中元素的数量。Returns:栈中元素的数量。"""count = 0current = self.head.next  # 从第一个有效节点开始while current is not None:count += 1current = current.next  # 移动到下一个节点return count  # 返回计数

3.5、判断是否为空

python">    def is_empty(self):"""检查栈是否为空。Returns:如果栈为空返回 True,否则返回 False。"""return self.head.next is None  # 如果头节点的 next 为 None,栈为空

3.6、访问栈顶元素

python">    def peek(self):"""查看栈顶元素但不弹出。如果栈为空,返回 None。Returns:栈顶的数据,如果栈为空则返回 None。"""if self.is_empty():return None  # 如果栈为空,返回 Nonereturn self.head.next.data  # 返回栈顶元素

3.7、完整代码

python">class Node:def __init__(self, data):"""初始化节点,包含数据和指向下一个节点的指针。Args:data: 节点存储的数据。"""self.data = dataself.next = None  # 初始时,节点的 next 指向 Noneclass StackLink:def __init__(self):"""初始化一个空栈,使用头节点作为哨兵。"""self.head = Node(0)  # 哨兵节点,方便操作def is_empty(self):"""检查栈是否为空。Returns:如果栈为空返回 True,否则返回 False。"""return self.head.next is None  # 如果头节点的 next 为 None,栈为空def size(self):"""返回栈中元素的数量。Returns:栈中元素的数量。"""count = 0current = self.head.next  # 从第一个有效节点开始while current is not None:count += 1current = current.next  # 移动到下一个节点return count  # 返回计数def push(self, data):"""将数据压入栈中。Args:data: 要压入栈中的数据。"""new_node = Node(data)  # 创建新节点new_node.next = self.head.next  # 新节点的 next 指向当前栈顶self.head.next = new_node  # 更新栈顶为新节点def peek(self):"""查看栈顶元素但不弹出。如果栈为空,返回 None。Returns:栈顶的数据,如果栈为空则返回 None。"""if self.is_empty():return None  # 如果栈为空,返回 Nonereturn self.head.next.data  # 返回栈顶元素def pop(self):"""从栈中弹出数据。如果栈为空,打印提示信息。Returns:弹出的数据,如果栈为空则返回 None。"""if self.is_empty():print('空空如也')  # 栈为空,无法弹出数据return None  # 返回 None,指示无数据可弹出popped_data = self.head.next.data  # 获取栈顶元素self.head.next = self.head.next.next  # 移动栈顶指针到下一个节点return popped_data  # 返回弹出的数据def travel(self):"""遍历栈并打印所有元素。"""current = self.head.next  # 从第一个有效节点开始while current is not None:print(current.data, end=' ')  # 打印当前节点的数据current = current.next  # 移动到下一个节点print()  # 换行if __name__ == '__main__':s = StackLink()  # 创建一个栈实例s.push(10)  # 压入 10s.push(20)  # 压入 20s.push(30)  # 压入 30s.push(40)  # 压入 40s.push(50)  # 压入 50s.travel()  # 打印当前栈的所有元素print("Popped:", s.pop())  # 弹出栈顶元素并打印s.travel()  # 打印弹出后的栈元素

四、思维导图


http://www.ppmy.cn/embedded/164211.html

相关文章

银河麒麟系统安装mysql5.7【亲测可行】

一、安装环境 cpu:I5-10代; 主板:华硕; OS:银河麒麟V10(SP1)未激活 架构:Linux 5.10.0-9-generic x86_64 GNU/Linux mysql版本:mysql-5.7.34-linux-glibc2.12-x86_64.ta…

时间序列预测实战:指数平滑法详解与MATLAB实现

摘要 本文系统讲解指数平滑法的核心理论与实战应用,涵盖一次、二次、三次及差分指数平滑技术。通过电器销售额预测、发电量趋势分析等案例,详细解析加权系数选择、初始值设定与误差修正机制,并提供完整的MATLAB实现代码。结合预测误差评估与…

如何在本地和服务器新建mysql用户和密码

文章目录 一. MySQL安装和卸载二. 新建mysql用户,测试连接2.1 服务器中语法操作2.2 宝塔面板中安装 三. 注意 一. MySQL安装和卸载 MySQL安装 点开下面的链接:https://dev.mysql.com/downloads/mysql/ 安装msi安装包即可。下载新版本的mysql前应该先卸…

【Linux】【网络】frp 如何准确将 客户端B 请求转发给 服务器A 的

【Linux】【网络】frp 如何准确将 客户端B 请求转发给 服务器A 的 先来看一下上个文章的配置 1配置部分 1.1frp 配置 frp一直在监听7000这个端口上是否有请求到达 [common] bind_port 7000 # 云服务器监听的端口1.2 服务器A配置 [common] server_addr frp_ip; # 云服…

java基础语知识(8)

类之间的关系 在类之间,最常见的关系有: 依赖(“uses-a”);聚合(“has-a”);继承(“is-a”)。 依赖:一种使用关系,即一个类的实现需要另一个类的协助&#x…

Weboffice在线Word权限控制:限制编辑,只读、修订、禁止复制等

在现代企业办公中,文档编辑是一项常见且重要的任务。尤其是在线办公环境中,员工需要在网页中打开和编辑文档,但如何确保这些文档只能进行预览而无法被编辑或复制,成为许多企业面临的一个痛点。尤其是在处理涉密文档时,…

vue3 在element-plus表格使用render-header

在vue2中 element表格render-header 源码是有返回h()函数的 在vue3 element-plus 表格源码 render-header函数没有返回h函数了 所以需要用render-header方法中创建虚拟DOM节点的话需要引用h方法 <el-table-column header-align"right" align"right" …

嵌入式音视频开发(二)ffmpeg音视频同步

系列文章目录 嵌入式音视频开发&#xff08;零&#xff09;移植ffmpeg及推流测试 嵌入式音视频开发&#xff08;一&#xff09;ffmpeg框架及内核解析 嵌入式音视频开发&#xff08;二&#xff09;ffmpeg音视频同步 嵌入式音视频开发&#xff08;三&#xff09;直播协议及编码器…