五分钟“手撕”栈
实现代码放开头,供大家学习与查阅
目录
一、实现代码
二、什么是栈
三、栈的常见操作
底层实现是链表。
入栈
出栈
四、Stack的使用
五、栈的习题
第一题
第二题
第三题
第四题
第五题
第六题
第七题
六、栈、虚拟机栈、栈帧的区别
目录
一、实现代码
二、什么是栈
三、栈的常见操作
底层实现是链表。
入栈
出栈
四、Stack的使用
五、栈的习题
第一题
第二题
第三题
第四题
第五题
第六题
第七题
六、栈、虚拟机栈、栈帧的区别
一、实现代码
package demo1;import java.util.Arrays;
import java.util.Stack;public class MyStack {int[] array;int size;public MyStack() {array = new int[3];}private void ensureCapacity() {if (array.length == size) {array = Arrays.copyOf(array, 2 * array.length);}}public int push(int e) {ensureCapacity();array[size++] = e;return e;}public int pop() {int i = peek();size--;return i;}public int peek() {if (empty()) {throw new RuntimeException("栈为空,无法获取栈顶元素");}return array[size - 1];}public int size() {return size;}public boolean empty() {return 0 == size;}
}
二、什么是栈
简单来说,先进后出的队伍!
堆叠这些元素的底部,我们叫栈底,顶部我们叫栈顶。 元素进入栈,叫入栈。元素离开栈,叫出栈。生活有很多类似于栈:
三、栈的常见操作
底层实现是链表。
入栈
只需要把节点添加到链表中的头节点即可。
出栈
只需要和删除链表的头节点即可
四、Stack的使用
方法 | 功能 |
Stack() | 构造一个空的栈 |
E push(E e) | 将e入栈,并返回e |
E pop() | 将栈顶元素出栈并返回 |
E peek() | 获取栈顶元素 |
int size() | 获取栈中有效元素个数 |
boolean empty() | 检测栈是否为空 |
public static void main(String[] args) {Stack<Integer> s = new Stack();s.push(1);s.push(2);s.push(3);s.push(4);System.out.println(s.size()); // 获取栈中有效元素个数---> 4System.out.println(s.peek()); // 获取栈顶元素---> 4s.pop(); // 4出栈,栈中剩余1 2 3,栈顶元素为3System.out.println(s.pop()); // 3出栈,栈中剩余1 2 栈顶元素为3
if(s.empty()){System.out.println("栈空");
}else{System.out.println(s.size());}
}
五、栈的习题
第一题
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,因为栈遵循先进后出。所以后面进来的数字可以先出去,
对于A:1入栈后出栈,就是4入栈后出栈(这里2和3已经入栈了,栈顶3),3出栈,2出栈
对于B:2入栈后出栈(这里1已经入栈了)3入栈后出栈,4入栈后出栈,1出栈
对于C:3入栈后出栈(这里1和2已经入栈,栈顶2)因为栈顶为2,只能出2,不能是1
对于D:3入栈后出栈(这里1和2已经入栈,栈顶2)4入栈后出栈。2出栈,1出栈
第二题
2.一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出栈的顺 序是( )。
A: 12345ABCDE B: EDCBA54321 C: ABCDE12345 D: 54321EDCBA
选B,依次进栈,栈底为1,栈顶为E,先出E,最后是1。
第三题
逆序打印链表
// 递归方式
void printList(Node head){if(null != head){printList(head.next);System.out.print(head.val + " ");
}
}
// 循环方式
void printList(Node head){if(null == head){return;
}Stack<Node> s = new Stack<>();
// 将链表中的结点保存在栈中Node cur = head;while(null != cur){s.push(cur);cur = cur.next;
}
// 将栈中的元素出栈while(!s.empty()){System.out.print(s.pop().val + " ");
}
}
第四题
括号匹配
思路如下:
1.我们先new一个栈,来存放左括号,如果遇到右括号,就pop出来看看匹不匹配
2.循环走完,如果栈刚好为空,则true;如果没走完循环,栈就空了,说明不匹配false。
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.empty()){return false;}char chL=Stack.peek();if(chL=='('&&ch==')'||chL=='{'&&ch=='}'||chL=='['&&ch==']'){Stack.pop();}else{return false;}}}return Stack.empty();}
第五题
逆波兰表达式
什么是逆波兰表达式?
答:逆波兰表达式也叫后缀表达式,我们平常见的数学计算式比如10+(1-2)就是中缀表达式,它的后缀表达式为1012-+。
拓展:如何中缀转后缀?
思路如下:
new一个栈存放数字,如果遇到操作符就pop栈里面的两个数字出来,然后把操作后的数字再push到栈顶,最后pop出栈里面的最后一个数
public int evalRPN(String[] tokens) {Stack<Integer> Stack = new Stack<>();for (int i = 0; i < tokens.length; i++) {if (!isOparation(tokens[i])) {Integer var = Integer.valueOf(tokens[i]);Stack.push(var);} else {Integer var2 = Stack.pop();Integer var1 = Stack.pop();switch (tokens[i]) {case "+":Stack.push(var1 + var2);break;case "-":Stack.push(var1 - var2);break;case "*":Stack.push(var1 * var2);break;case "/":Stack.push(var1 / var2);break;}}}return Stack.pop();}public boolean isOparation(String s) {if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {return true;}return false;}
第六题
出栈入栈顺序匹配
思路如下:
new一个栈存放数据,
1.遍历pushV数组,每次入栈之后,判断是否和popV数组下标的数一致
2.不一样,继续i++;一样,出栈,j++
3.出栈的过程当中,如果一直是一样的,那么一直出,遇到不一样的,i++继续入栈
public boolean IsPopOrder (int[] pushV, int[] popV) {// write code hereint j=0;Stack<Integer> stack=new Stack<>();for(int i=0;i<pushV.length;i++){stack.push(pushV[i]);while(j<popV.length&&!stack.empty()&&stack.peek()==popV[j]){stack.pop();j++;}}return stack.empty();}
第七题
最小栈
思路如下:
存放元素的过程:push()
1.如果第一次存放元素,普通栈和最小栈都得存放
2.如果不是第一次存放的时候,普通栈肯定得放,但是最小栈我们需要和最小栈的栈顶元素比较,是否比最小栈的元素小或等于,只有小于等于才能放
取元素的过程: pop()
1. 每次pop元素的是很好,都需要判断pop的元素是不是和最小栈的栈顶元素一样?
一样:最小栈也得pop。
top==》peek()返回值是普通栈的值
getMIn()获取最小栈的栈顶元素
import java.util.Stack;class MinStack {Stack<Integer> Stack;Stack<Integer> MinStack;public MinStack() {Stack = new Stack<>();MinStack = new Stack<>();}public void push(int val) {Stack.push(val);if (MinStack.empty()) {MinStack.push(val);} else {Integer peekVal=MinStack.peek();if (val <= MinStack.peek()) {MinStack.push(val);}}}public void pop() {if (Stack.empty()) {return;} else {int popVal=Stack.pop();if (popVal == MinStack.peek()) {MinStack.pop();}}}public int top() {if (Stack.empty()) {return -1;}return Stack.peek();}public int getMin() {if (MinStack.empty()) {return -1;}return MinStack.peek();}
}
六、栈、虚拟机栈、栈帧的区别
栈:先进后出的数据结构,这篇博客写的
虚拟机栈:存放局部变量的
栈帧:给方法开辟内存的
参考书籍:《Hello!算法》
相关文章:

五分钟“手撕”栈
实现代码放开头,供大家学习与查阅 目录 一、实现代码 二、什么是栈 三、栈的常见操作 底层实现是链表。 入栈 出栈 四、Stack的使用 五、栈的习题 第一题 第二题 第三题 第四题 第五题 第六题 第七题 六、栈、虚拟机栈、栈帧的区别 目录 一、…...

MAC也能玩转3A大作 Crossover使用指南 crossover运行战地5
众所周知,在Mac上你本不该玩游戏。但是如果你实在犯了这个瘾了,你可以使用Parallel Desktop来运行所有Windows程序。但是繁重的虚拟机对磁盘容量提出了较高的要求,(可能虚拟机用了大概半年就会到60-80GB这样的大小)&am…...

docker私有镜像仓库的搭建及认证
简介: docker私有镜像仓库的搭建及认证 前言 在生产上使用的 Docker 镜像可能包含我们的代码、配置信息等,不想被外部人员获取,只允许内 网的开发人员下载。 Docker 官方提供了一个叫做 registry 的镜像用于搭建本地私有仓库使用。在内部网…...

simCSE句子向量表示(1)-使用transformers API
SimCSE SimCSE: Simple Contrastive Learning of Sentence Embeddings. Gao, T., Yao, X., & Chen, D. (2021). SimCSE: Simple Contrastive Learning of Sentence Embeddings. arXiv preprint arXiv:2104.08821. 1、huggingface官网下载模型 官网手动下载:pri…...

网络运维的重要性
一、介绍 网络运维,英文名为Network Operations (NetOps),指的是负责维护和管理企业或组织内部网络设备和系统的团队或个人。网络运维的主要目标是确保网络的稳定运行和高效性能,以满足企业或组织的需求。 网络运维工作涵盖了多个方面&…...

还不会使用多线程优化代码执行效率?codefun教你在业务场景中使用CompletableFuture进行优化!
业务场景 我们先来从场景入手,具体的业务是这样的:我们需要从某的省的id去查询这个省份所有的县区,至于什么是县区呢?在DB中我们是这样定义的,也就是字段level 3 的时候,就代表一个县的信息,然后呢&#…...

数据结构-堆(带图)详解
前言 本篇博客我们来仔细说一下二叉树顺序存储的堆的结构,我们来看看堆到底如何实现,以及所谓的堆排序到底是什么 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:数据结构_普通young man的博客-CSDN博客 若有问题 评…...
React Native 之 react-native-share(分享)库 (二十三)
react-native-share 是一个流行的 React Native库,它允许你在移动应用中分享文本、链接、图片等内容到各种社交网络和消息应用。以下是对其原理的简要概述以及代码示例的解析。 代码示例解析 1. 安装 npm install react-native-share # 或者 yarn add react-n…...

JCR一区级 | Matlab实现TCN-BiGRU-MATT时间卷积双向门控循环单元多特征分类预测
JCR一区级 | Matlab实现TCN-BiGRU-MATT时间卷积双向门控循环单元多特征分类预测 目录 JCR一区级 | Matlab实现TCN-BiGRU-MATT时间卷积双向门控循环单元多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现TCN-BiGRU-MATT时间卷积双向门控循环单元多…...
游戏心理学Day01
心理学 心理学是一门研究心理过程和行为及其如何受有机体的生理,心理状态和外部影响的科学 心理学不是常识的代名词,心理学分为基础,心理学和应用心理学基础,心理学研究的目的在于描述,解释,预测和控制行…...

错误模块路径: ...\v4.0.30319\clr.dll,v4.0.30319 .NET 运行时中出现内部错误,进程终止,退出代码为 80131506。
全网唯一解决此BUG的文章!!! 你是否碰到了以下几种问题?先说原因解决思路具体操作1、首先将你C:\Windows\Microsoft.NET\文件夹的所有者修改为你当前用户,我的是administrator。2、修改当前用户权限。3、重启电脑4、删…...
005 CentOS 7.9 RabbitMQ安装及配置
https://github.com/rabbitmq/rabbitmq-server/releases https://www.rabbitmq.com/docs/download https://packagecloud.io/rabbitmq/rabbitmq-server https://www.erlang-solutions.com/downloads/ https://www.erlang.org/ 文章目录 卸载erlerl版本安装与下载版本不匹配正…...

Xcode 15 libarclite 缺失问题
升级到Xcode 15运行项目报错,报错信息如下: SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum d…...

绘画智能体分享
这是您请求的故宫雪景图,角落有一只可爱的胖猫,采用了水墨画风格,类似于张大千的作品。希望您喜欢这幅画! 🎨 选项 1【转变风格】——将这幅画转变为梵高的后印象派风格,增添一些梵高特有的笔触和色彩。 &…...
7_2、C++程序设计进阶:数据共享
数据与函数 数据与函数局部变量全局变量类的数据成员 类的静态成员静态数据成员静态函数成员 友元友元函数友元类 函数之间实现数据共享有以下几种方式:局部变量、全局变量、类的数据成员、类的静态成员和友元。 如何共享局部变量呢? 在主调函数和被调…...
d2-crud-plus 使用小技巧(五)—— 搜索时间(或下拉列表)后,点击X清除按钮后返回值为null,导致异常
问题 使用vue2elementUId2-crud-plus,时间组件自动清除按钮,点击清除按钮后对应的值被设置为null,原本应该是空数组([]),导致数据传到后端后报错。不仅适用于搜索,表单一样有效果。 解决方法 …...

ChatGPT成知名度最高生成式AI产品,使用频率却不高
5月29日,牛津大学、路透社新闻研究所联合发布了一份生成式AI(AIGC)调查报告。 在今年3月28日—4月30日对美国、英国、法国、日本、丹麦和阿根廷的大约12,217人进行了调查,深度调研他们对生成式AI产品的应用情况。 结果显示&…...

R19 NR移动性增强概况
随着5G/5G-A技术不断发展和业务需求的持续增强,未来网络的部署将不断向高频演进。高频小区的覆盖范围小,用户将面临更为频繁的小区选择、重选、切换等移动性过程。 为了提升网络移动性能和保障用户体验,移动性增强一直是3GPP的热点课题。从NR…...

C语言:如何写文档注释、内嵌注释、行块注释?
技术答疑流程 扫描二维码,添加个人微信;支付一半费用,获取答案;如果满意,则支付另一半费用; 知识点费用:10元 项目费用:如果有项目任务外包需求,可以微信私聊...
Turtle中circle用法详解
在Python的Turtle图形库中,circle方法是一个非常灵活的工具,它允许我们以简单的方式绘制圆或圆的一部分。本文将深入探讨circle方法,特别关注radius和extent参数的用途及其正负值的意义。 一、circle方法概览 首先,让我们了解一…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...