【数据结构(五)】栈

❣博主主页: 33的博客❣
▶️文章专栏分类:数据结构◀️
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你学更多数据结构知识

在这里插入图片描述

目录

  • 1.前言
  • 2.概念
  • 3.栈的使用
  • 4.栈的应用场景
    • 4.1有效的括号
    • 4.2逆波兰表达式
    • 4.3栈的压入弹出序列
    • 4.4最小栈
  • 5.总结

1.前言

最近淄博烧烤的热度很大啊,同学们想去淄博吃吃烤串吗?那想一想,在我们串肉的时候,最先串上的肉,是不是最后在被我们吃到呢?其实这就是日常生活在的一个“栈”,在数据结构中栈又是什么样子的呢?接下来,博主将详细介绍栈的相关知识。


2.概念

栈: 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守 后进先出LIFO(Last In First Out)的原则。
在这里插入图片描述


3.栈的使用

在这里插入图片描述
注意
pop()与peek()的区别:pop是将栈顶元素出栈,peek只是瞄一眼并不出栈
在这里插入图片描述
从上图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。


4.栈的应用场景

例1
若进栈序列为 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,1、2、3入栈以后,3再出栈,此时栈顶为2,只能出2,不能出


4.1有效的括号

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效:OJ链接

public boolean isValid(String s) {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{//遇到右括号了if(stack.isEmpty()){return false;}if(ch=='}'&&stack.peek()=='{'||ch==')'&&stack.peek()=='('||ch==']'&&stack.peek()=='['){stack.pop();}else{return false;}}        }if(!stack.isEmpty()){return false;}return true;  }

4.2逆波兰表达式

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式:OJ链接

 public int evalRPN(String[] tokens) {Stack<Integer> stack=new Stack<>();for (String X:tokens){if(!isOperation(X)){stack.push(Integer.parseInt(X));}else {int num2=stack.pop();int num1=stack.pop()switch (X){case "+":stack.push(num1+num2);break;case "-":stack.push(num1-num2);break;case "*":stack.push(num1*num2);  break;case "/":stack.push(num1/num2);break;}}}return stack.peek();}private boolean isOperation(String x) {if(x.equals("+")||x.equals("-")||x.equals("*")||x.equals("/")){return true;}return false;}

4.3栈的压入弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序:OJ链接
解题思路:

假设入栈顺序是:[1,2,3,4,5],出栈顺序是:[4,3,5,1,2]
每次入栈一个元素后检查栈顶元素,和出栈的元素进行比较,如果相同,那么此元素出栈。
如果结束后,栈内依然有元素,那么第二个序列是否可能为该栈的弹出顺序。

public boolean IsPopOrder (int[] pushV, int[] popV) {Stack<Integer>stack=new Stack<>();int j=0;for (int i=0;i<pushV.length;i++){stack.push(pushV[i]);while (!stack.isEmpty()&&j<popV.length&&popV[j]==stack.peek()){stack.pop();j++;}}return stack.isEmpty();}

4.4最小栈

设置一个最小栈,并能在常数时间内检索到最小元素的栈:OJ链接
解题思路

创建两个栈,一个用于存放所有元素,一个用于存放最小元素,
入栈时,把入栈元素和最小栈的栈顶元素m进行比较,如小于或等于m,则也存入最小栈
出栈时,把出栈元素与m比较,如果相同则最小栈也出栈。

public class MinStack {Stack<Integer> minStack;Stack<Integer> stack;public MinStack() {minStack =new Stack<>();stack=new Stack<>();}void push(int val){stack.push(val);if(minStack.isEmpty()){minStack.push(val);}else {if (val<=minStack.peek()){minStack.push(val);}}}void pop(){int a=stack.pop();if(!minStack.isEmpty()&&a==minStack.peek()){minStack.pop();}}int top(){return stack.peek();}int getMin(){if(!minStack.isEmpty()){return minStack.peek();}return -1;}
}

5.总结

本篇文章,主要讲解了最小栈的概念,栈的使用,栈的应用场景,感兴趣的同学可以自己实现一个栈。

下期预告:队列

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

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

相关文章

分布式系统接口限流方案

Git地址&#xff1a;https://gitee.com/deepjava/test-api-limit.git 方案一、 Guava工具包 实现单机版限流 具体代码见git 方案二、Redis lua脚本 实现分布式系统的接口限流 具体代码见git

AI虽强,搜索引擎仍不可或缺

AI 领域正以前所未有的速度发展&#xff0c;大模型的发布变得愈发频繁&#xff0c;模型的规模也在持续扩大。如今&#xff0c;大模型的起点已经攀升至数十亿参数&#xff08;数十 B&#xff0c;B 是 Billion 的简写&#xff0c;10 亿&#xff09;&#xff0c;其功能之广泛&…

OSCP靶场--Banzai

OSCP靶场–Banzai 考点(ftp爆破 webshell上传web1访问403web2可以访问webshell反弹mysql udf提权) 1.nmap扫描 ## nmap扫描一定要使用 -p- 否则容易扫不全端口 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.158.56 -Pn -p- --min-rate 2500Starting Nmap 7.…

循序渐进丨MogDB 数据库带级联从库的集群切换后如何保持原有架构?

生产数据库运行过程中可能会涉及到升级或者打补丁&#xff0c;导致各节点的角色有计划的发生改变。如果集群内角色发生改变&#xff0c;是否还能保持原有架构继续对外提供服务呢&#xff1f;我们来做一下测试。 采用22模式模拟同城两机房部署4节点 MogDB 数据库集群&#xff0c…

【计算机毕业设计】人事管理系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

设计模式(22):解释器模式

解释器 是一种不常用的设计模式用于描述如何构成一个简单的语言解释器&#xff0c;主要用于使用面向对象语言开发的解释器和解释器设计当我们需要开发一种新的语言时&#xff0c;可以考虑使用解释器模式尽量不要使用解释器模式&#xff0c;后期维护会有很大麻烦。在项目中&…

基于java+springboot+vue实现的居家养老健康管理系统(文末源码+Lw)23-313

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装智慧社区居家养老健康管理系统软件来发挥其高效地信息处理…

c++编程(3)——类和对象(1)、类

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 类对象类的访问权限类的作用域 类 c最初对c语言的扩展就是增加了类的概念&#xff0c;使得c语言在原有的基础之上可以做到信息隐藏和封装。 那么我们先来讲讲“带类的c”与C语言相比有什么改进。 先讲讲类…

使用ArrayList.removeAll(List list)导致的机器重启

背景 先说一下背景&#xff0c;博主所在的业务组有一个核心系统&#xff0c;需要同步两个不同数据源给过来的数据到redis中&#xff0c;但是每次同步之前需要过滤掉一部分数据&#xff0c;只存储剩下的数据。每次同步的数据与需要过滤掉的数据量级大概在0-100w的数据不等。 由…

SpringBoot项目中拦截器获取Body参数的问题

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 首先我们要知道一个问题: HttpServletRequest的输入流只能读取一次,如…

【深度学习实战(2)】如何使用matplotlib.pyplot模块记录自己的训练,验证损失

一、matplotlib库 在我们自己训练模型时&#xff0c;常常会使用matplotlib库来绘制oss和accuracy的曲线图&#xff0c;帮助我们分析模型的训练表现。 matplotlib库安装&#xff1a;pip install matplotlib 二、代码 import matplotlib.pyplot as plt import torch import to…

手机号授权页面<案例>

使用uview <template><view><view class"bind">绑定手机号</view><view class"title">依据《网络安全法》&#xff0c;互联网注册用户要提供 基于移动电话号码等方式的验证</view><view><u--form ref"…