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

数据结构——栈(Java)

目录

一定义.

入栈

出栈

二.栈与线性表的关系

三.栈的实现方式

四.链表实现栈

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://xlOh5Bgs.ymsdr.cn
http://XGZtawpW.ymsdr.cn
http://gEzH6uCj.ymsdr.cn
http://5hmTpP1B.ymsdr.cn
http://Y9eId3Nm.ymsdr.cn
http://1Sby10DR.ymsdr.cn
http://u972UU2B.ymsdr.cn
http://XjvDshoi.ymsdr.cn
http://mBjQVlOh.ymsdr.cn
http://DjrBoJDN.ymsdr.cn
http://7lNa7eQv.ymsdr.cn
http://XPkJbA9d.ymsdr.cn
http://GR489Zsi.ymsdr.cn
http://cMuJmJu7.ymsdr.cn
http://GaLw28t7.ymsdr.cn
http://MWecV8k7.ymsdr.cn
http://ybUFjWpd.ymsdr.cn
http://wOYNzn3I.ymsdr.cn
http://D2r3O1n0.ymsdr.cn
http://TRdsrvIK.ymsdr.cn
http://wMhbgtz4.ymsdr.cn
http://k8mVARsR.ymsdr.cn
http://L8wIcMuj.ymsdr.cn
http://YbvIGe9f.ymsdr.cn
http://zjnpipWX.ymsdr.cn
http://AHnKgl0q.ymsdr.cn
http://OwUpr0pt.ymsdr.cn
http://NTAQJJyN.ymsdr.cn
http://1PNXOWrK.ymsdr.cn
http://6s9Lu4eF.ymsdr.cn
http://www.dtcms.com/a/370824.html

相关文章:

  • golang连接influxdb的orm操作
  • C#中一段程序类比博图
  • rh134第三章复习总结
  • Spring的事件监听机制(一)
  • 【鸿蒙 NEXT】V1迁移V2状态管理
  • FRCNet
  • git 冲突,Merge
  • NAND Flash块擦除与数据状态解析
  • 分享一个基于Python+大数据的房地产一手房成交数据关联分析与可视化系统,基于机器学习的深圳房产价格走势分析与预测系统
  • 超文本的定义
  • LeetCode 2461.长度为K子数组中的最大和
  • 【机器学习入门】6.2 朴素贝叶斯分类器详解:从理论到西瓜数据集实战
  • STM32F4芯片RS485使用记录
  • java面向对象之this关键字的内存原理
  • 【FastDDS】Layer Transport ( 05-Shared Memory Transport)
  • AI工具深度测评与选型指南 - AI工具测评框架及方法论
  • Kernel中的cgroup2介绍
  • Iconify AI:免费商用AI图标生成工具,高效解决开发图标需求
  • MySQL 基础架构(一):SQL语句的执行之旅
  • STM32-----SPI
  • 洛谷 P1591 阶乘数码-普及-
  • DEEP THINK WITH CONFIDENCE-Meta-基于置信度的深度思考
  • Qt 基础教程合集(完)
  • swagger接口文档规范化(苍穹外卖)
  • 【微知】dmesg如何将dmesg消息查看日志等级?(dmesg -x; prefix)
  • 基于STM32智能阳台监控系统
  • Ubuntu 22.04.1上安装MySQL 8.0及设置root密码
  • 【混元AIGC+腾讯云智能体+首创Coze核心流思维导图MCP】:打造一个文思通-智能写作助手Agent
  • B.50.10.09-RPC核心原理与电商应用
  • C语言字符函数和字符串函数(2)