Java数据结构——Stack

Stack

  • 栈的概念和使用
    • 栈的概念
    • 栈的使用
  • 栈的应用
    • 出栈元素序列
    • 有效的括号
    • 栈的压入、弹出序列
    • 逆波兰表达式
    • 最小栈

栈的概念和使用

栈的概念

栈(Stack):一种特殊的线性表,只允许再栈的一端进行插入和删除元素,这一端点被称为栈顶另一端就是栈顶
栈中有两种使用:
入栈(push):插入数据进入栈中,入栈在栈顶
出栈(pop):删除栈中数据,出的是栈顶的数据
遵循的是先入后出的原则

在这里插入图片描述

栈的使用

方法功能
Stack()构造空的栈
E push(E e)将e入栈,返回e
E pop()将栈顶元素取出
E peek()获取栈顶元素
int size()栈的有效元素个数
boolean empty()判断栈是否为空

E push(E e) 将e入栈,返回e

public class Test {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1);stack.push(2);stack.push(10);System.out.println(stack);}
}

运行结果如下
在这里插入图片描述

E pop() 将栈顶元素取出
E peek() 获取栈顶元素

public class Test {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1);stack.push(2);stack.push(10);System.out.println(stack);int ret = stack.pop();//10 ,取出栈顶元素int ret1 = stack.peek();//2 //获取栈顶元素是多少System.out.println(ret);System.out.println(ret1);System.out.println("出栈后"+stack);//出栈后,栈中数据 1 2}
}

这里的pop是出栈的意思,而peek()只是获取其栈顶元素,并不是出栈,不会影响栈中元素
所以这里会取出栈顶元素10 而 在获取栈顶元素是2,最终栈中元素是1 2
在这里插入图片描述

int size() 栈的有效元素个数
boolean empty() 判断栈是否为空

public class Test {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1);stack.push(2);stack.push(3);stack.push(5);stack.push(11);System.out.println(stack.size());//栈的元素个数 5 System.out.println(stack.empty());//这里栈不为空,false}
}

在这里插入图片描述

栈的应用

出栈元素序列

题目:若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的⼀个出栈序列是()
A: 1,4,3,2 B: 2,3,4,1 C: 3,1,4,2 D: 3,4,2,1
答案是 C
A : 如果是1进栈,1出栈,在将1 2 3放入进去再出栈,这样出栈结果就1 4 3 2
B: 1进栈,先不出来,2 3 4依次进栈后就出栈,这样结果出栈结果为 2 3 4 1
C: 先出3 说明 1 2 3已经进栈了,3 出栈 2就是栈顶,不可以直接出1,所以错误
D 1 2 进栈,3 4分别进栈后出栈,最后出栈2 1结果为 3 4 2 1
在这里插入图片描述
C选项错误,所以选C

有效的括号

在这里插入图片描述

目的:括号是否可以左右匹配成功 “()” 或者 "([ ])"类型的都是匹配成功
思路:1创建一个Character类型的栈
2.如果遇到左边括号就将其放入栈中遇到右括号就与栈顶括号元素进行匹配,匹配不成功就直接返回false,匹配成功就继续向后匹配,入栈重复操作
3 在匹配的时候,如果栈为空,返回false
4.最后右括号匹配完成,但是栈不为空也返回false

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

1.这里再进行匹配的时候如果栈为空说明没有其右括号左边没有左括号入栈
2.如果匹配失败直接
3.最后字符串遍历完了,但是不为空,说明栈中的左括号没有全部匹配
这上面三种情况不符合要求直接返回false
class Solution {public boolean isValid(String s) {//创建一个Character的栈Stack<Character> stack = new Stack<>();//遍历for(int i = 0;i<s.length();i++){char ch= s.charAt(i);//左括号入栈if(ch=='('||ch=='{'||ch=='['){stack.push(ch);}else{//匹配//1.判断栈是否为空if(stack.empty()){return false;}//2.出栈进行匹配char ch2 = stack.peek();if(ch2=='('&&ch==')'||ch2=='['&&ch==']'||ch2=='{'&&ch=='}'){stack.pop();}else{//不匹配return false;}}}//最后如果栈不为空,说明还有没匹配的if(!stack.empty()){return false;}return true;}
}

栈的压入、弹出序列

在这里插入图片描述

目的:有一个所有数都不相同的pushV数组压栈顺序,有一个和压栈的数相同出栈顺序,判断这个出栈顺序是否正确
思路:1.遍历这个pushV,将其元素进行入栈,2.并进行判断,栈顶元素是否与出栈顺序相同,相同就出栈,不相同就继续入栈,继续判断,重复操作
最后遍历完整个pushV数组,如果栈为空,说明其出栈顺序正确

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

1.这里的进行栈顶元素与popV判断明显是个while循环,因为可能连续出栈
2.并且这个循环不仅要判断是否相同也要注意栈不为空再进行判断
3.遍历完整个pushV数组后,最后如果栈为空说明出栈顺序是对的返回true,反之是false
import java.util.*;public boolean IsPopOrder (int[] pushV, int[] popV) {// write code hereStack<Integer> stack = new Stack<>();int j=0;//遍历弹出序列for(int i = 0;i<pushV.length;i++){//入栈stack.push(pushV[i]);//根据给出弹出的序列看看是否要出栈while(!stack.empty()&&stack.peek()==popV[j]){j++;stack.pop();//出栈}}//如果最后stack为空,说明成功了return stack.empty();}
}

逆波兰表达式

在这里插入图片描述
逆波兰式
在这里插入图片描述

目的:给一个逆波兰表达式,求出其结果
思路:使用栈进行计算,遇到数字就入栈,反之就是运算符,就要出栈进行计算

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

1.这里就是遇到数字字符就进行入栈,这里注意将数字字符转为数字,
2.遇到运算符就要计算,将计算结果入栈
3.最后返回栈顶数据就是计算结果
class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack();for(String str: tokens){if(!isOperator(str)){stack.push(Integer.valueOf(str));//转换为数字入栈}else{//反之就出栈计算//将计算结果入栈int val1 = stack.pop();int val2 = stack.pop();switch(str){case "+":stack.push(val2+val1);break;case "-":stack.push(val2-val1);break;case "*":stack.push(val2*val1);break;case "/":stack.push(val2/val1);break;}}}return stack.pop();}//判断是不是运算符private boolean  isOperator(String s){if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){return true;}return false;}
}

最小栈

在这里插入图片描述

目的:获取其栈中最小元素
思路:就是创建两个栈,1.正常栈一个栈是正常将所有元素依靠顺序入栈,出栈
2.最小栈用来放栈中最小元素,栈顶是最小元素,这样获取最小元素的效率是O(1)

>

在这里插入图片描述

注意这里在入栈的时候也要将和最小栈相同的元素也要放入进去
出栈的时候,也要注意栈的最小元素可能发生变化,最小栈可能也要出栈
这时候无论如何,最小栈栈顶就是栈中最小的元素
class MinStack {private Stack<Integer> stack;private Stack<Integer> minStack;public MinStack() {stack = new Stack<>();minStack = new Stack<>();}public void push(int val) {//将=最小栈顶元素的值也要放入最小栈if(minStack.empty()||val<=minStack.peek()){minStack.push(val);}stack.push(val);}public void pop() {//注意这里如果出栈的话,最小值可能发生变化if(stack.peek().equals(minStack.peek())){minStack.pop();}stack.pop();}public int top() {return stack.peek();  }public int getMin() {return minStack.peek();}
}

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

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

相关文章

神经网络与计算机视觉

2016 年,随着 AlphaGo 在围棋比赛中击败李世石,“人工智能”、“神经网络”、“深度 学习”等字眼便越来越多的出现在大众眼前,智能化好像成为一种不可逆转的趋势,带给大家新奇感的同时也带来了一丝忧惧:在不远的未来,机器是否真的拥有思维和情感?《终结者》中天网大战人…

VS2019 与gitcode团队管理

1、安装git 点击下一步安装即可 2、vs2019连接gitcode 然后更改本地的代码添加文件等都可以进行远程同步操作了

Python类和对象四(十三)

魔法方法&#xff1a; 按位运算 按位于运算 只要相同才是1 或运算&#xff1a; 只要某个位是1结果就是1 、 按位非 将结果取反 按位异或&#xff1a; 左移和右移运算符&#xff1a; 右移两位 右移动n位&#xff0c;就是除以2的n次方 左移两位&#xff1a; 左移n位就是乘…

如何设置极狐GitLab 议题截止日?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 截止日期 (BASIC ALL) 可以在议题中使用截止日期&#xff0c;来跟踪截止日期并确保功能按时交付。用户至少需要报告者权限才…

如何在 Conda 环境中降级 Python 版本:详细指南

如何在 Conda 环境中降级 Python 版本&#xff1a;详细指南 Python 版本的管理在开发过程中至关重要&#xff0c;特别是在处理不同项目需求时。对于使用 Conda 环境的 Python 程序员来说&#xff0c;版本管理不仅仅是安装不同的 Python 版本&#xff0c;还涉及到依赖关系的兼容…

【随笔】地理探测器原理与运用

文章目录 一、作者与下载1.1 软件作者1.2 软件下载 二、原理简述2.1 空间分异性与地理探测器的提出2.2 地理探测器的数学模型2.21 分异及因子探测2.22 交互作用探测2.23 风险区与生态探测 三、使用&#xff1a;excel 一、作者与下载 1.1 软件作者 作者&#xff1a; DOI: 10.…

使用达梦官方管理工具SQLark快速生成数据库ER图并导出

在数据库设计与开发中&#xff0c;实体-关系图&#xff08;ER 图&#xff09;作为数据建模的核心工具&#xff0c;能够直观呈现表结构、字段属性及表间关系&#xff0c;是团队沟通和文档维护的重要工具。然而&#xff0c;对于许多使用达梦数据库的开发者来说&#xff0c;可用的…

单精度浮点运算/定点运算下 MATLAB (VS) VIVADO

VIVADO中单精度浮点数IP核计算结果与MATLAB单精度浮点数计算结果的对比 MATLAB定点运算仿真&#xff0c;对比VIVADO计算的结果 目录 前言 一、VIVADO与MATLAB单精度浮点数运算结果对比 二、MATLAB定点运算仿真 总结 前言 本文介绍了怎么在MATLAB中使用单精度浮点数进行运算…

力扣-141.环形链表

题目描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中存在环 &#xff0c;则返回 true 。 否则&#xff0c;返回 false 。 class Solution { public:bool hasCycle(ListNode *head) {ListNode *fast head;ListNode *slow head;while (fast! n…

RESTful学习笔记(一)

Web发展 一、API 程序硬件接口&#xff08;Application Programming Interface&#xff09;&#xff0c;是预先定义好的逻辑函数&#xff0c;软件系统不同组成部分衔接的约定&#xff0c;直接调用函数&#xff0c;无序访问代码细节&#xff0c;分为SDK和Web应用接口两类 SDK…

SD2351核心板:重构AI视觉产业价值链的“超级节点”

在AI视觉技术狂飙突进的当下&#xff0c;一个吊诡的现象正在浮现&#xff1a;一方面&#xff0c;学术界不断刷新着ImageNet等基准测试的精度纪录&#xff1b;另一方面&#xff0c;产业界却深陷“算法有、场景无&#xff0c;技术强、落地难”的怪圈。明远智睿SD2351核心板的问世…

【数据结构】红黑树原理及实现

目录 一. 红黑树的概念1. 红黑树的规则思考 2. 红黑树的效率 二.红黑树的实现1. 红黑树的结构2. 红黑树的插入3. 红黑树的平衡调整情况1&#xff1a;变色情况2&#xff1a;单旋变色情况3&#xff1a;双旋变色 4. 红黑树插入及平衡调整代码实现5.红黑树的验证 一. 红黑树的概念 …

时间复杂度分析

复杂度分析的必要性&#xff1a; 当给我们一段代码时&#xff0c;我们是以什么准则来判断代码效率的高低呢&#xff1f;每一段代码都会消耗一段时间&#xff0c;或占据一段数据空间&#xff0c;那么自然是在实现相同功能的情况下&#xff0c;代码所耗时间最少&#xff0c;所占…

L1-1、Prompt 是什么?为什么它能“控制 AI”?

*Prompt 入门 L1-1 想象一下&#xff0c;你只需输入一句话&#xff0c;AI 就能自动为你写一篇文案、生成一份报告、甚至规划你的创业计划。这种“对话即编程”的背后魔法&#xff0c;就是 Prompt 的力量。 &#x1f50d; 一、Prompt 的定义与由来 Prompt&#xff08;提示词&am…

微信小程序文章管理系统开发实现

概述 在内容为王的互联网时代&#xff0c;高效的文章管理系统成为各类平台的刚需。幽络源平台今日分享一款基于SSM框架开发的微信小程序文章管理系统完整解决方案&#xff0c;该系统实现了多角色内容管理、智能分类、互动交流等功能。 主要内容 一、用户端功能模块 ​​多角…

【Python-Day 5】Python 格式化输出实战:%、format()、f-string 对比与最佳实践

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

R7周:糖尿病预测模型优化探索

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 一、数据预处理 1.设置GPU import torch.nn.functional as F import torch.nn as nn import torch, torchvisiondevice torch.device("cuda"…

使用Tortoise-ORM和FastAPI构建评论系统

title: 使用Tortoise-ORM和FastAPI构建评论系统 date: 2025/04/25 21:37:36 updated: 2025/04/25 21:37:36 author: cmdragon excerpt: 在models.py中定义了Comment模型,包含id、content、created_at、updated_at字段,并与User和Article模型建立外键关系。schemas.py中定义了…

【VS Code】如何使用SSH打开远程服务器Docker上的项目或文件夹

要在VS Code中使用SSH打开远程服务器Docker上的项目或文件夹&#xff0c;您需要结合使用VS Code的Remote - SSH扩展和Docker的远程访问功能。以下是详细步骤&#xff1a; 安装VS Code Remote - SSH扩展 打开VS Code。点击左侧活动栏的扩展图标&#xff08;或使用快捷键CtrlShif…

NHANES指标推荐:PLP

文章题目&#xff1a;Association of pyridoxal 5-phosphate (PLP) with lipid profiles: a population-based cohort study DOI&#xff1a;10.3389/fnut.2025.1545301 中文标题&#xff1a;5-磷酸吡哆醛 (PLP) 与血脂谱的关系&#xff1a;一项基于人群的队列研究 发表杂志&am…