实现一个栈数据结构

实现一个栈数据结构

实现一个栈数据结构是一个基础但重要的编程任务。栈是一种后进先出(LIFO)的数据结构,它允许我们在一端添加或删除元素。在栈中,最后添加的元素总是最先被删除,这类似于一堆盘子:新盘子放在顶部,取盘子时也是从顶部开始取。

以下是一个使用Python语言实现栈数据结构的示例,我们将从定义栈的基本操作开始,然后逐步扩展其功能,并讨论栈在实际应用中的一些用途。

一、栈的基本定义与操作

栈的基本操作包括:入栈(push)、出栈(pop)、查看栈顶元素(peek)以及判断栈是否为空(is_empty)。

 

python复制代码

class Stack:
def __init__(self):
self.items = []
def push(self, item):
"""入栈操作,将元素添加到栈顶"""
self.items.append(item)
def pop(self):
"""出栈操作,移除并返回栈顶元素"""
if not self.is_empty():
return self.items.pop()
else:
raise IndexError("Pop from an empty stack")
def peek(self):
"""查看栈顶元素,不移除"""
if not self.is_empty():
return self.items[-1]
else:
raise IndexError("Peek from an empty stack")
def is_empty(self):
"""判断栈是否为空"""
return len(self.items) == 0
def size(self):
"""返回栈的大小"""
return len(self.items)

在这个实现中,我们使用Python的列表(list)作为底层数据结构来存储栈中的元素。push方法使用append将元素添加到列表的末尾,即栈顶;pop方法使用pop移除并返回列表的最后一个元素,即栈顶元素;peek方法返回列表的最后一个元素但不移除它;is_empty方法检查列表是否为空来判断栈是否为空;size方法返回列表的长度,即栈的大小。

二、扩展栈的功能

除了基本操作外,我们还可以根据需要扩展栈的功能。例如,我们可以实现一个能够限制栈大小的栈,或者在栈满时自动扩容。

 

python复制代码

class BoundedStack:
def __init__(self, max_size):
self.items = []
self.max_size = max_size
# 其他方法与Stack类相同,但在push时添加对栈大小的检查
def push(self, item):
if self.size() < self.max_size:
self.items.append(item)
else:
raise IndexError("Stack is full")

在这个BoundedStack类中,我们添加了一个max_size参数来限制栈的最大容量。在push方法中,我们首先检查栈的大小是否已经达到最大值,如果是,则抛出一个异常;否则,执行正常的入栈操作。

三、栈的应用场景

栈在实际编程中有许多应用场景,以下是一些例子:

  1. 函数调用与递归:在计算机程序中,函数调用栈用于保存函数调用时的上下文信息,包括局部变量、返回地址等。每次函数调用时,都会将相关信息压入栈中;函数返回时,则从栈中弹出相关信息。递归算法也依赖于栈来保存中间结果和递归调用的上下文。
  2. 括号匹配:在编译原理中,栈常用于检查表达式中的括号是否匹配。例如,对于字符串"((a+b)*c)-d",我们可以使用一个栈来跟踪尚未匹配的左括号,当遇到右括号时,从栈中弹出一个左括号进行匹配。如果最终栈为空,则说明所有括号都匹配;否则,存在未匹配的括号。
  3. 浏览器后退功能:在Web浏览器中,后退功能可以看作是一个栈的应用。当用户浏览网页时,每个访问过的页面都被压入一个栈中;当用户点击后退按钮时,从栈中弹出当前页面并显示前一个页面。
  4. 撤销与重做操作:在许多编辑器和IDE中,撤销和重做功能也是通过栈来实现的。撤销操作将当前状态压入栈中并回退到上一个状态;重做操作则从栈中弹出上一个状态并恢复到该状态。

四、总结

通过实现一个栈数据结构并讨论其应用场景,我们可以看到栈在计算机科学和编程中的重要作用。栈的简单性和高效性使其成为解决许多问题的有力工具。无论是函数调用、括号匹配还是浏览器后退功能,栈都提供了一种优雅且高效的方式来处理具有后进先出特性的数据。随着对栈的深入理解和应用,我们将能够更好地利用这一数据结构来解决实际问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

特殊数据类型

目录 记录类型 定义一个记录类型 myrecord_type&#xff0c;用于存储 emp 数据表中的员工姓名和职务 %TYPE 类型 定义一个变量&#xff0c;存储数据表 emp 中编号为 7369 的员工姓名&#xff0c;并且显示出结果 %ROWTYPE 类型 声明一个用于存储 emp 数据表中每行记录的变…

【力扣每日一题】2908. 元素和最小的山形三元组 I

LC2908. 元素和最小的山形三元组 I 给你一个下标从 0 开始的整数数组 nums 。 如果下标三元组 (i, j, k) 满足下述全部条件&#xff0c;则认为它是一个 山形三元组 &#xff1a; i < j < k nums[i] < nums[j] 且 nums[k] < nums[j] 请你找出 nums 中 元素和最小…

【力扣hot100】160.相交链表

相交链表 给你两个单链表的头节点 headA和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回…

hibernate映射文件详解

hibernate映射文件 映射文件在.hbm.xml文件中编写 <?xml version"1.0" encoding"UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hiberna…

牛客练习赛123 A~C

A.炸鸡块哥哥的粉丝题 输出字符串的前 ⌈ n 2 ⌉ \lceil \frac{n}{2} \rceil ⌈2n​⌉ 个字符 void solve() {int n;string s;cin >> n >> s;cout << s.substr(0, (n 1) / 2); }B.智乃想考一道鸽巢原理 当小球总个数为奇数时&#xff0c;贪心的留下 1 个…

天梯算法Day3整理

浮点数解析 炸鱼题掠过 冲突值 题面 解析 方法一 —— 并查集 按照边值排序&#xff0c;然后按边值从大到小遍历&#xff0c;通过并查集判断能否将所有点无冲突地归于两个集合。在判断时&#xff0c;若有两个点不得不产生冲突&#xff0c;则输出这两个点之间的边值并结束。…

LeetCode Python - 81. 搜索旋转排序数组 II

目录 题目描述解法运行结果 题目描述 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转 &#xff0c;使数组变为 […

<商务世界>《第28课 商务旅行的注意事项》

1 选择人气旺的酒店 酒店找一个旺气的地方。1是干净、整洁是最重要的。2是在选择酒店的时候尽量选择闹市&#xff0c;人口要集中的地方&#xff0c;这样入住率有保证&#xff0c;人多气场旺不至于发生一些灵异事件。而且人少屋多&#xff0c;也会让我们没有安全感。 2 避免无…

关于AllOriginSubtypes和AllDestinationSubtypes拓扑检查官方文档有误导

目录 1.问题描述&#xff1a; 2.有问题的代码&#xff1a; 3.修改能正确执行的代码 &#xff1a; 1.问题描述&#xff1a; 当两个要素类参与拓扑时&#xff0c;官方有一段代码&#xff0c;将拓扑规则加到拓扑中 ITopologyRule.AllOriginSubtypes Property Indicates if al…

好用还平价的挂耳式耳机有哪些?五款超平价品牌测评推荐

在数字化时代&#xff0c;耳机已经成为我们日常生活中不可或缺的一部分。而开放式耳机作为一种新兴趋势&#xff0c;以其独有的开放性设计和卓越的音质表现&#xff0c;正在悄然改变着人们的听音习惯。不同于传统的耳机产品&#xff0c;开放式耳机让音乐与外界环境相得益彰&…

【GSAP】ScrollTrigger插件的注意事项 | 用的好,非常流畅。用的不好,卡到爆炸的前端动画库

问题描述 调用gsap插件的ScrollTrigger的batch方法时 &#xff0c;有以下2种情况之一要进行垃圾回收处理&#xff0c;若不做处理会导致页面超级卡顿。 在动画运行完毕&#xff0c;不再使用动画时元素被删除时 例子 给当前动画一个id&#xff0c;是因为后期不用此动画时&…

软件测试工程师介绍

引言 在快速发展的软件行业中&#xff0c;软件测试工程师扮演着至关重要的角色。他们不仅是质量保证的第一道防线&#xff0c;也是确保软件产品满足用户需求、无缺陷地运行的关键。随着软件开发过程日益复杂和迭代速度的加快&#xff0c;软件测试工程师的工作变得更加重要但也…

我暂停了我的博士学位,尝试了一些不同的东西,然后带着一个新的视角回来了

警报在我耳边响起。静音后&#xff0c;我躺在床上&#xff0c;盯着天花板又看了30分钟。我继续攻读博士学位的动力正在减弱&#xff0c;这使得我越来越难以站起来&#xff0c;面对每一个新的疲惫的日子。我意识到&#xff0c;在我的计划剩下的 2 年里继续奋斗将冒着完全倦怠和崩…

简述如何系统地学习Python

随着人工智能、大数据和云计算等技术的快速发展&#xff0c;编程已经成为了当今社会中不可或缺的一项技能。Python作为一种高级编程语言&#xff0c;因其简洁明了的语法、强大的功能和广泛的应用领域&#xff0c;成为了许多初学者和专业人士的首选。那么&#xff0c;如何系统地…

微前端的使用和注意事项 - qiankun

一、为什么使用微前端 微前端架构旨在解决单体应用在一个相对长的时间跨度下&#xff0c;由于参与的人员、团队的增多、变迁&#xff0c;从一个普通应用演变成一个巨石应用(Frontend Monolith)后&#xff0c;随之而来的应用不可维护的问题。微前端的核心目标是将巨石应用拆解成…

4.C#对接微信Native支付(调用支付下单生成二维码接口)

在完成了前边几篇文章的操作后&#xff0c;我们接下来需要写实际的业务接口。调用微信的native下单接口。 手先看下官网的api文档&#xff0c;https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_1.shtml 大概的流程是&#xff1a;商户后台系统先调用微信支付的Nativ…

Bun - NodeJS的替代

什么是Bun Bun 是采用 Zig 语言编写的高性能 “全家桶” JavaScript 运行时。Bun 提供了打包、转译、安装和运行 JavaScript & TypeScript 项目的功能&#xff0c;内置原生打包器 (native bundler)、转译器、task runner、npm 客户端&#xff0c;以及 fetch、WebSocket等 …

Matlab与数学计算

原文地址&#xff1a;Matlab与数学计算 - Pleasure的博客 下面是正文内容&#xff1a; 前言 这是一篇笔记。主要用于介绍MatLab的作用以及其作为数学工具的使用方法。 目的是总结学校课件复习自用&#xff0c;但是不可能像相关的书籍那么系统全面&#xff0c;力求简单明了。都…

pygame用自带函数绘制三角形 计算重心坐标

三角形重心坐标公式 三角形重心的坐标可以通过其三个顶点的坐标计算得出&#xff0c;公式为((X1X2X3)/3,(Y1Y2Y3)/3)。12 这是因为在平面直角坐标系中&#xff0c;重心的坐标是顶点坐标的算术平均数 中间黑点是重心坐标 import pygame from pygame.locals import * import sy…

面试题:Spring RESTful服务设计与控制器最佳实践

在设计Spring框架下的RESTful服务时&#xff0c;遵循一系列最佳实践可以帮助您创建出简洁、一致且易于维护的API。以下是几个关键的Spring RESTful服务设计与控制器的最佳实践&#xff1a; ### 1. 资源导向设计 (Resource-Oriented Design) - 定义资源RESTful API的设计…