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

数据结构——栈(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://www.xdnf.cn/news/20435.html

相关文章:

  • MySQL数据库约束和设计
  • 附050.Kubernetes Karmada Helm部署联邦及使用
  • C++_哈希
  • 基于阿里云ECS搭建Tailscale DERP中继服务器:提升跨网络连接速度
  • 前端登录鉴权详解
  • C++面试10——构造函数、拷贝构造函数和赋值运算符
  • 西门子S7-200 SMART PLC:编写最基础的“起保停”程序
  • [特殊字符] 从零到一:打造你的VSCode圈复杂度分析插件
  • Linux内核源码获取与编译安装完整指南
  • Java8函数式编程之Stream API
  • 预闪为什么可以用来防红眼?
  • C/C++动态爱心
  • Caffeine Weigher
  • 蓓韵安禧DHA纯植物藻油纯净安全零添加守护母婴健康
  • 基于STM32智能阳台监控系统
  • Unity 如何使用ModbusTCP 和PLC通讯
  • 用 Go + HTML 实现 OpenHarmony 投屏(hdckit-go + WebSocket + Canvas 实战)
  • 《sklearn机器学习——绘制分数以评估模型》验证曲线、学习曲线
  • 鸿蒙Next开发指南:UIContext接口解析与全屏拉起元服务实战
  • DevOps实战(2) - 使用Arbess+GitPuk+Docker实现Java项目自动化部署
  • Rsyslog日志采集
  • 快捷:常见ocr学术数据集预处理版本汇总(适配mmocr)
  • js闭包问题
  • B.50.10.07-分布式锁核心原理与电商应用
  • 操作系统之内存管理
  • 从 0 到 1 学 sed 与 awk:Linux 文本处理的两把 “瑞士军刀”
  • 数据结构:栈和队列(下)
  • Qt控件:Item Views/Widgets
  • 国产数据库之YashanDB:新花怒放
  • 源滚滚AI编程SillyTavern酒馆配置Claude Code API教程