(JAVA)浅尝关于 “栈” 数据结构

1. 栈的概述:

1.1 生活中的栈

存储货物或供旅客住宿的地方,可引申为仓库、中转站。例如酒店,在古时候叫客栈,是供旅客休息的地方,旅客可以进客栈休息,休息完毕后就离开客栈

1.2计算机中的栈

  • 将生活中的栈的概念引入到计算机汇总,就是供数据休息的地方,它是一种数据结构,数据既可以进入到栈中,又可以从栈中出去。
  • 栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。
    • 它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)
  • 我们称数据进入到栈的动作为压栈,数据从栈中出去的动作为弹栈

在这里插入图片描述

2. 栈的实现

2.1 栈API设计

类名Stack
构造方法Stack():创建Stack对象
成员方法1. public boolean isEmpty():判断栈是否为空,是返回true,否返回false
2. public int size():获取栈中元素的个数
3. public T pop():弹出栈元素
4. public void push(T t):向栈中压入元素t
成员变量1. private Node head:记录首节点
2. private int N:当前栈的元素个数
成员内部类private class Node:节点类

2.2 代码实现

package com.renexdemo.linear;import java.util.Iterator;public class Stack<T> implements Iterable<T> {private Node head;private int N;// 节点类private static class Node<T>{public T item;// 存储元素public Node next;// 指向下一个节点public Node(T item, Node next) {this.item = item;this.next = next;}}// 初始化栈public Stack() {this.head = new Node(null,null);this.N = 0;}// 判断栈是否为空public boolean isEmpty(){return N == 0;}// 获得栈中的数量public int size(){return N;}// 压栈public void push(T t){// 找到首节点指向的第一个节点Node oldNode = head.next;// 创建新节点Node<T> newNode = new Node<>(t, null);// 让首节点指向新节点head.next = newNode;// 让新节点指向原来的第一个节点newNode.next = oldNode;// 元素个数+1N++;}// 弹栈public T pop(){// 找到首节点指向的第一个节点Node oldFirst = head.next;if (oldFirst == null){return null;}// 让首节点指向原来第一个节点的下一个节点head.next=oldFirst.next;// 元素个数-1N--;return (T) oldFirst.item;}@Overridepublic Iterator<T> iterator() {return new SIterator();}private class SIterator implements Iterator{private Node n;public SIterator() {this.n = head;}@Overridepublic boolean hasNext() {return n.next != null;}@Overridepublic Object next() {n = n.next;return n.item;}}
}

3. 案例

3.1 括号匹配问题

问题描述:

给定一个字符串,里边可能包含"()"小括号和其他字符,请编写程序检查该字符串中的小括号是否成对出现

例如:

"(上海)(长安)":正确匹配;
"上海((长安))":正确匹配;
"上海(长安(北京)(深圳)南京)":正确匹配;
"上海(长安))":错误匹配;
"(上海(长安)":错误匹配;

在这里插入图片描述在这里插入图片描述

代码实现

// 判断str中的括号是否匹配
public static boolean isMatch(String str){// 1. 创建栈对象,用来存储左括号Stack<String> chars = new Stack<>();// 2. 从左往右遍历字符串for (int i = 0; i < str.length(); i++) {String currChar = str.charAt(i) + "";// 3. 判断当前字符是否为左括号,如果是,则把字符放入到栈中if (currChar.equals("(")){chars.push(currChar);}else if (currChar.equals(")")){// 4. 继续判断当前字符是否是有括号,// 如果是,则从栈中弹出一个左括号,并判断弹出的结果是否为null// 如果为null证明没有匹配的左括号,如果不为null,则存在匹配的左括号String pop = chars.pop();if (pop == null){return false;}}}// 5. 判断栈中还有没有剩余的左括号,如果有,则证明括号不匹配if (chars.size() == 0){return true;}else {return false;}
}

3.2 逆波兰表达式求值问题

3.2.1 中缀表达式

​ 中缀表达式就是我们平常生活中使用的表达式,例如:1+3*2,2,2-(1+3)等等,中缀表达式的特点是:二元运算符总是置于两个操作数中间。

​ 中缀表达式是人们最喜欢的表达式方式,因为简单、易懂。但是对于计算机来说就不是这样了,因为中缀表达式的运算顺序不具有规律性,不同的运算符具有不同的优先级,如果计算机执行中缀表达式,需要解析表达式语义,做大量的优先级相关操作

3.2.2 逆波兰表达式(后缀表达式):

​ 逆波兰表达式是 波兰逻辑学家j · 卢卡西维兹(J · Lukasewicz) 于1929年首先提出的一种表达式的表示方法,后缀表达式的特点:运算符总是放在跟它相关的操作数之后

中缀表达式逆波兰表达式
a+bab+
a+(b-c)abc-+
a+(b-c)*dabc-d*+
a*(b-c)+dabc-*d+

3.2.3 需求:

给定一个只包含加减乘除四种运算的逆波兰表达式的数组表示方式,求出该逆波兰表达式的结果

在这里插入图片描述

3.2.4 实现代码

// 执行逆波兰表达式
public static int caculote(String[] notaion){// 1. 定义一个栈,用来存储操作数Stack<Integer> oprands = new Stack<>();// 2. 从左往右遍历逆波兰表达式,得到每一个元素for (int i = 0; i < notaion.length; i++) {String curr = notaion[i];Integer o1,o2,result;// 3. 判断当前元素是运算符还是操作数switch (curr){// 4. 运算符,从栈中弹出两个操作数,完成运算,运算玩的结果压入到栈中case "+":o1 = oprands.pop();o2 = oprands.pop();result = o2 + o1;oprands.push(result);break;case "-":o1 = oprands.pop();o2 = oprands.pop();result = o2 - o1;oprands.push(result);break;case "*":o1 = oprands.pop();o2 = oprands.pop();result = o2 * o1;oprands.push(result);break;case "/":o1 = oprands.pop();o2 = oprands.pop();result = o2 / o1;oprands.push(result);break;default:// 5. 操作数,把该操作数放入到栈中oprands.push(Integer.parseInt(curr));break;}}// 6. 得到栈中最后一个元素,就是逆波兰表达式的结果int reulst = oprands.pop();return reulst;
}
3.2.4.1 逻辑问题

当做进行运算符计算时,由于栈是先进后出类型。

所以弹出两个元素,不能是第一个弹出的元素对第二个元素进行运算。

例如:{17,16}

  • 17先压栈,然后16

  • 那么在弹栈后,16为第一个元素,17为第二个元素,当作 / 或 - 运算时就不符合本身的运算逻辑了
    意思是原来操作逻辑是17-16那么经过弹栈后,两者互调了位置变成了16-17。这两个结果是截然不同的

4. 总结:

常见,常用的数据结构,同样也比较好实现,可以在许多的业务场景中见到类似的模式,分析这种结构后可以提高一定的见解。

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

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

相关文章

有些硬盘录像机接入视频汇聚平台EasyCVR后通道不显示/显示不全,该如何处理?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。该平台不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能&#xff0c;还支持多种主流标准协议&#xff0c;如GB28181、RTSP/Onvif、RTMP、部标JT808、GA/T 1400协…

Pikachu-Sql Inject-数字型注入(GET)

一、、破解 SQL 查询语句中的字段数 ?id1 order by 3 -- // -- 是注释&#xff0c; 加号 在MySQL中会转成空格 order by 1 &#xff0c;by 数字几&#xff0c;就是按照第几列进行排序&#xff1b;如果没有这一行&#xff0c;则报错 如&#xff1a;以下语句&#xff0c;根据…

RabbitMQ(死信队列)

一、本文抒写背景 前面我也在延迟队列篇章提到过死信队列&#xff0c;也提到过一些应用场景&#xff01; 今天呢&#xff0c;这篇文章&#xff0c;主要就是实战一个业务场景的小Demo流程&#xff0c;哈哈&#xff0c;那就是延迟关闭订单。 二、开始啦&#xff01;letgo! 首…

Qt系统学习篇(6)-QMainWindow

QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget)&#xff0c;是许多应用程序的基础&#xff0c;如文本编辑器&#xff0c;图片编…

MyBatisPlus——学习笔记

MyBatisPlus 一、导入依赖 <!-- MyBatisPlus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!-- MySql --><de…

【AIGC】VoiceControl for ChatGPT指南:轻松开启ChatGPT语音对话模式

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;安装VoiceControl for ChatGPT插件&#x1f4af;如何使用VoiceControl for ChatGPT进行语音输入VoiceControl for ChatGPT快捷键注意点 &#x1f4af;VoiceControl for C…

mfc140u.dll缺失?快速解决方法全解析,解决mfc140u.dll错误

当你的电脑出现找不到mfc140u.dll的问题&#xff0c;不少用户在使用电脑时陷入了困扰。这个错误提示就像一道屏障&#xff0c;阻挡了用户正常使用某些软件。无论是办公软件、游戏还是专业的设计工具&#xff0c;一旦出现这个问题&#xff0c;都会导致软件无法正常运行。如果您也…

webGL入门(六)图形旋转

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</…

ndb9300public-ndb2excel简介

1 引言 ndb9300是一个自己定义的机载导航数据库劳作&#xff08;不敢称为项目&#xff09;代号&#xff0c;其中3表示是第3种数据库。 多年前&#xff0c;对在役民航客机中的某型机载导航数据库的二进制文件进行分析&#xff0c;弄明白它的数据结构后做了几个工具&#xff0c…

Redis-持久化机制

Redis持久化方式 rdb -> 全量 aof -> 增量 也可以两种同时开启&#xff0c;混合持久化(4.0 后) rdb 简介 配置文件 redis 6.0.16 及其以下 redis 6.2 7.0 配置说明 有两种触发方式&#xff1a;手动&#xff0c;自动 修改 save 5 2dir /myredis/dump (储存的文件夹需…

【机器学习】探索GRU:深度学习中门控循环单元的魅力

目录 &#x1f354; GRU介绍 &#x1f354; GRU的内部结构图 2.1 GRU结构分析 2.2 GRU工作原理 2.4 Bi-GRU介绍 2.3 使用Pytorch构建GRU模型 2.5 GRU优缺点 &#x1f354; 小结 学习目标 &#x1f340; 了解GRU内部结构及计算公式. &#x1f340; 掌握Pytorch中GRU工具…

1000题-计算机网络系统概述

术语定义与其他术语的关系SDU&#xff08;服务数据单元&#xff09;相邻层间交换的数据单元&#xff0c;是服务原语的表现形式。在OSI模型中&#xff0c;SDU是某一层待传送和处理的数据单元&#xff0c;即该层接口数据的总和。 - SDU是某一层的数据集&#xff0c;准备传递给下一…

【开源免费】基于SpringBoot+Vue.JS洗衣店订单管理系统(JAVA毕业设计)

本文项目编号 T 068 &#xff0c;文末自助获取源码 \color{red}{T068&#xff0c;文末自助获取源码} T068&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 顾…

vue框架学习 -- 日历控件 FullCalendar 使用总结

最近在项目中要实现日期排班的功能&#xff0c;正好要用到日历视图的控件&#xff0c;经过对比发现&#xff0c;vue 中 使用 FullCalendar 可以实现相关需求&#xff0c;下面对使用过程做一个总结。 一. 引入 FullCalendar 控件 package.json 中添加相关依赖 "dependen…

【CSS in Depth 2 精译_043】6.5 CSS 中的粘性定位技术 + 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…

.net Framework 4.6 WebAPI 使用Hangfire

C# 使用 Hangfire 第一章 .net Framework 4.6 WebAPI 使用Hangfire 文章目录 C# 使用 Hangfire前言一、hangfire是什么?二、hangfire的特点三、.net Framework 中hangfire的使用方法第一步:创建WebAPI控制器第二步:添加nuget包第三步 创建startup类新建项目startup类Startu…

Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)

文章目录 esp-rs 简介GithubRust 包仓库Rust 教程Wokwi 电子模拟器开发环境Rust 环境esp-rs 环境创建 ESP32C3 项目项目结构编译项目命令运行模拟器ESP32C3 烧录 esp-rs 简介 esp-rs 是一个专注于为 Espressif 系列芯片&#xff08;如 ESP32、ESP32-S2、ESP32-C3 等&#xff0…

TypeScript 算法手册 - 【冒泡排序】

文章目录 TypeScript 算法手册 - 冒泡排序1. 冒泡排序简介1.1 冒泡排序定义1.2 冒泡排序特点 2. 冒泡排序步骤过程拆解2.1 比较相邻元素2.2 交换元素2.3 重复过程 3. 冒泡排序的优化3.1 提前退出3.2 记录最后交换位置案例代码和动态图 4. 冒泡排序的优点5. 冒泡排序的缺点总结 …

Unity3D播放GIF图片使用Animation来制作动画

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、下载GIF动图,用PS制作导出帧动画图片👉二、使用Animation制作动画👉三、脚本控制动画播放👉壁纸分享👉总结👉前言 unity播放gif图片,本身是不支持的,但是可以使用其他方法来实现, 1.有一种使用System…

微信小程序hbuilderx+uniapp+Android 新农村综合风貌旅游展示平台

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 小程序端…