目录

一定义.

入栈

出栈

二.栈与线性表的关系

三.栈的实现方式

四.链表实现栈

1.结点的API设计

2.栈的API设计

2.1栈的初始化设计

2.2元素入栈

2.3元素出栈

五.括号匹配问题

完整代码展示

答案


一定义.

栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
●我们称数据进入到栈的动作为压栈,数据从栈中出去的动作为弹栈

●栈(stack)又被称为堆栈,它是一种只允许在一端(一般是表尾)进行插入和删除操作的线
性表。
●作为一种特殊的数据结构,由于栈被限定只能在尾进行插入和删除操作

入栈

出栈

二.栈与线性表的关系

栈是一种特殊的线性表,它同样由一系列数据元素组成,但是栈的操作受到限制,只允许在一端(称为栈顶)进行插入(压栈,push)和删除(弹栈,pop)操作。栈遵循后进先出(LIFO,Last In First Out)的原则。

三.栈的实现方式

        栈通过以下两种方式实现:

        1.顺序表实现

        2.链表实现

        我们今天讲第二种方式。

四.链表实现栈

链表使用节点来存储数据元素。每个节点包含数据部分和指向下一个节点的引用。在链表实
现栈时,我们通常将链表的头节点作为栈顶

1.结点的API设计

2.栈的API设计

2.1栈的初始化设计

class StackResult<T>
{//结点类class  Node{T data;//存储数据Node next;//下一个结点public Node(T data, Node next) {this.data = data;this.next = next;}}//记录首结点private Node head;//元素个数private int N;// 构造方法public StackResult(){//初始化头结点this.head =new Node(null,null);this.N =0;//s初始元素个数为0}
}

2.2元素入栈

思路分析:根据前面的入栈流程图,我们可以简单分为4步

1.找到头结点指向栈顶的值

2.创建一个新结点,为新栈顶

3.让头结点指向新栈顶的值

4.让新结点指向原来的栈顶

 //把元素入栈public void push(T data){//找到头结点指向栈顶的值Node oldFirst=head.next;//创建新结点Node newFirst=new Node(data,null);//让头结点指向新结点head.next=newFirst;//让新结点指向原来的栈顶newFirst.next=oldFirst;N++;}

2.3元素出栈

思路分析:

根据前面的出栈流程图,我们可以分为

1.找到原来头结点指向栈顶的值

2.让头结点指向原来栈顶指向下一个结点的值

 //元素出栈public T pop(){//找到头结点指向栈顶的的值Node oldFirst=head.next;//检查是否为空if(oldFirst==null){return null;}//让头结点指向原来栈顶指向下一个结点的值head.next=oldFirst.next;N--;return oldFirst.data;}

五.括号匹配问题

问题描述:判断字符串”(a+b)*(c-d)”字符串中的括号是否匹配

 //括号匹配public static boolean  isMatch(String str ){//创建一个存储字符串的栈StackResult<Character> stack=new StackResult<>();//遍历字符串for(int i=0;i<str.length();i++){char ch=str.charAt(i);if(ch=='('){stack.push(ch);//当遇到字符(时,将其入栈}else if (ch==')')//遇到字符串)时,先检查栈是否为空{if(stack.isEmpty()){return false;//为空返回false}stack.pop();//不为空将其出栈}}return stack.isEmpty();//检查栈是否为空,为空则说明全部匹配成功,反之失败}

完整代码展示

class StackResult<T>
{//结点类class  Node{T data;//存储数据Node next;//下一个结点public Node(T data, Node next) {this.data = data;this.next = next;}}//记录首结点private Node head;//元素个数private int N;// 构造方法public StackResult(){//初始化头结点this.head =new Node(null,null);this.N =0;//s初始元素个数为0}//其他方法---------------------------------------------------//判断当前栈中的元素个数是否为0public boolean isEmpty(){return N==0;}//获取栈中的元素个数public int size(){return N;}//把元素入栈public void push(T data){//找到头结点指向栈顶的值Node oldFirst=head.next;//创建新结点Node newFirst=new Node(data,null);//让头结点指向新结点head.next=newFirst;//让新结点指向原来的栈顶newFirst.next=oldFirst;N++;}//元素出栈public T pop(){//找到头结点指向栈顶的的值Node oldFirst=head.next;//检查是否为空if(oldFirst==null){return null;}//让头结点指向原来栈顶指向下一个结点的值head.next=oldFirst.next;N--;return oldFirst.data;}//括号匹配public static boolean  isMatch(String str ){//创建一个存储字符串的栈StackResult<Character> stack=new StackResult<>();//遍历字符串for(int i=0;i<str.length();i++){char ch=str.charAt(i);if(ch=='('){stack.push(ch);//当遇到字符(时,将其入栈}else if (ch==')')//遇到字符串)时,先检查栈是否为空{if(stack.isEmpty()){return false;//为空返回false}stack.pop();//不为空将其出栈}}return stack.isEmpty();//检查栈是否为空,为空则说明全部匹配成功,反之失败}
}
public class StudentMs3
{public static void main(String[] args){String str ="(a+b)*(c-d)";boolean result = StackResult.isMatch(str);System.out.println(result);}
}

答案

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

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

相关文章

科研笔记:数学建模启发的课题研究方法

借鉴数学建模的思路解决科学问题或开展课题研究&#xff0c;核心是将实际问题抽象为数学框架&#xff0c;通过定量分析、逻辑推演和验证优化&#xff0c;实现对问题的精准描述、解释或预测。其本质是“从现实到数学&#xff0c;再从数学回归现实”的迭代过程&#xff0c;适用于…

Agent落地到底选择LangChain 还是 LangGraph

核心概念 LangChain:一个用于构建由大型语言模型驱动的应用程序的框架。它提供了大量的组件和现成的链,旨在简化和标准化应用程序与LLM交互的过程。 LangGraph:一个用于在LangChain之上构建有状态、多参与者的 工作流 的库。它特别擅长处理具有循环、分支和复杂协调的代理(…

ChatGPT下的相关聊天提示词

问&#xff1a;如果我觉得一个子对话里&#xff0c;聊天聊得太多&#xff0c;在这个项目下新开一个子对话&#xff0c;但是不想把上次太多的信息 都复制过来&#xff0c;有没有什么办法关键词&#xff1a;项目、子对话&#xff0c;上下文ChatGPT:有办法的 ✅在 ChatGPT 里&…

最新PDF版本!Acrobat Pro DC 2025,解压即用版

软件介绍 Adobe Acrobat Pro DC 2025 是全球知名的 PDF 编辑神器&#xff0c;被称为 “最牛 PDF 工具”&#xff0c;能轻松解决 PDF 编辑、创建、转换等难题&#xff0c;本次分享的版本解压即可使用。 软件特点 然解压即可使用不用登录注册最新版本 软件使用 我们打开软件选…

XX汽集团数字化转型:全生命周期网络安全、数据合规与AI工业物联网融合实践

引言&#xff1a;数字化转型中的安全与效率双轮驱动作为中国汽车行业的龙头企业&#xff0c;XX汽集团近年来积极推进数字化转型&#xff0c;通过构建全生命周期网络安全体系、完善数据合规治理框架&#xff0c;并深度融合AI工业物联网技术&#xff0c;实现了生产成本显著降低和…

云原生部署_Docker入门

Docker是啥Docker是一个开源的容器化平台&#xff0c;可以帮助开发者将应用程序和其依赖的环境打包成一个可移植、可部署的容器。Docker的主要目标是通过容器化技术&#xff0c;实现应用程序的快速部署、可移植性和可扩展性&#xff0c;从而简化应用程序的开发、测试和部署过程…

【大数据专栏】大数据框架-Apache Druid Overview

目录 Architecture Advantages and disadvantages 从架构以及设计可以得出结论&#xff0c;Durid不支持ACID事务&#xff0c;基于时间戳列和维度列去查询&#xff0c;所以适合基于时间做分组和学列的查询操作。 Advantages优势&#xff1a; 实时数据摄取与查询 支持秒级数据摄…

云平台面试内容(一)

1. 云计算的优点、服务模型区别及云部署模式 云计算优点: 云计算具有显著的优势,包括无需自建机房和硬件投入,资源即开即用并支持弹性伸缩,按需付费使成本透明可控。企业可以在数分钟内完成全球范围的部署,缩短上线周期。同时云平台提供高可用性和安全性,多副本容灾保证数…

嵌入式 - 硬件:51单片机(2)

本节重点&#xff1a;1. GPIO输入模式、输出模式2. 按键工作原理&#xff08;GPIO输入&#xff09;3. 中断概念4. 中断源概念、中断源个数、哪几个中断源5. 外部中断、定时器中断概念6. 中断处理流程&#xff1a;7. 51单片机中定时器的个数&#xff1f;类型8. 16位定时器和8位…

C语言中奇技淫巧07-使用GCC栈保护选项检测程序栈溢出

-fstack-protector 是 GCC 和 Clang 编译器提供的一种栈保护&#xff08;Stack Smashing Protection, SSP&#xff09; 机制&#xff0c;用于检测和防御常见的缓冲区溢出攻击&#xff08;特别是栈溢出&#xff09;。它通过在函数的栈帧中插入特殊的“金丝雀值”&#xff08;can…

.NET 8.0 Web API JWT 身份验证和基于角色的授权

在当今的数字环境中&#xff0c;保护 Web 应用程序的安全至关重要。随着 .NET 8.0 的不断发展&#xff0c;它提供了强大的工具来确保您的 API 既安全又高效。 示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/91490262 如果您喜欢此文章&#xff0c…

ZYNQ SDK软件在线调试

1、然后右键项目->debug as->launch on hardware2、从左到右分别是&#xff1a;运行程序到设置的断点暂停运行终止断开连接步进&#xff08;进入函数内部&#xff09;跳过&#xff08;不进入函数内部&#xff09;跳出函数3、双击添加断点&#xff0c;然后点击运行可以让程…

四大金刚之计算机操作系统

1. 进程和线程的区别&#xff1f;创建线程的代价比创建进程小吗&#xff1f;进程是资源分配和调度的基本单位&#xff1b;线程是 CPU 调度的基本单位。进程有独立的地址空间&#xff0c;线程共享进程地址空间。创建/销毁进程开销大&#xff0c;线程开销小。是的&#xff0c;因为…

redis--redis.conf的相关配置问题

关于redis.conf内的相关重要的配置介绍 1. bind 配置 仅仅设置bind&#xff0c;还需要搭配下面的rotected-mode 配置才能外部ip进行连接 功能&#xff1a;设置 Redis 监听的 IP 地址&#xff0c;决定哪些设备可以连接到 Redis 服务器。 bind 127.0.0.1&#xff1a;只允许本机&a…

unsloth 笔记:从最近的检查点继续微调

检查点&#xff08;checkpointing&#xff09;可以把微调进度保存下来&#xff0c;这样可以中途暂停&#xff0c;随后继续训练。首先需要在 Trainer 的参数里添加 save_strategy 和 save_steps。trainer SFTTrainer(....args TrainingArguments(....output_dir "output…

DevOps平台选型指南:破解研发效率瓶颈,适配金融/政务/国产化场景的5大关键指标

在数字化转型的浪潮中&#xff0c;软件研发效能已成为企业的核心竞争力。然而&#xff0c;许多团队在追求敏捷与高速交付的过程中&#xff0c;常常会遇到工具链割裂、流程冗长、环境混乱等效率瓶颈。选择一个合适的、一体化的DevOps平台&#xff0c;是破解这些瓶颈、实现研发运…

【面试向】元宇宙介绍

属于基础知识介绍&#xff0c;主要目的是对这一概念有技术层面的理解&#xff0c;有前瞻性的观点&#xff0c;帮助大家在面试中给出得体的表述。 1. 什么是元宇宙&#xff1f; 元宇宙本质上是一个融合了数字与现实、由技术构建的 “沉浸式虚拟空间”&#xff0c;是一个 “超越…

FreeMarker快速入门指南

FreeMarker快速入门指南 FreeMarker是一个基于模板和数据模型生成文本输出的Java库。它广泛应用于Web开发、代码生成、邮件模板等场景。本文将带你快速上手FreeMarker的核心概念和基本用法。 什么是FreeMarker FreeMarker是一个模板引擎&#xff0c;它将模板文件&#xff08;.f…

Nginx主配置文件

一&#xff0c;Nginx基本介绍1&#xff0c;nginx概念Nginx 是一款轻量级、高性能的服务器软件&#xff0c;核心能力是 “处理网络请求”&#xff0c;被广泛用于网站、App 的后端架构中。Nginx 就像一个 “高效的网络交通指挥官”&#xff0c;核心价值是用最少的资源&#xff0c…

基于ResNet50的智能垃圾分类系统

基于ResNet50的智能垃圾分类系统&#xff1a;从理论到实践的完整指南 源码获取https://mbd.pub/o/bread/YZWXlZ1yZg 引言&#xff1a;智能垃圾分类的时代背景与意义 随着城市化进程的加速和人口数量的增长&#xff0c;垃圾处理问题日益成为全球性的环境挑战。传统的垃圾分类…