五分钟“手撕”栈

2024-06-01 22:36
文章标签 五分钟

本文主要是介绍五分钟“手撕”栈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实现代码放开头,供大家学习与查阅 

目录

一、实现代码

二、什么是栈

三、栈的常见操作

底层实现是链表。

入栈

出栈 

四、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!算法》 

这篇关于五分钟“手撕”栈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022288

相关文章

每天五分钟玩转深度学习PyTorch:nn.Module中封装好的神经网络层

本文重点 PyTorch实现了神经网络中绝大多数的layer,这些layer都继承于nn.Module,封装了可学习参数parameter,并实现了forward函数,且很多都专门针对GPU运算进行了CuDNN优化,其速度和性能都十分优异。本文介绍pytorch中已经封装好的神经网络层,我们可以直接通过nn.的方式来调用。本文主要学习第2步(模型搭建)。 全连接层 nn.Linear(i

五分钟看完 Linux 重点知识,建议收藏!

点击上方“朱小厮的博客”,选择“设为星标” 后台回复”1024“获取公众号专属1024GB资料 来源:rrd.me/f3v9F 写在前面 我们都知道Linux是一个支持多用户、多任务的系统,这也是它最优秀的特性,即可能同时有很多人都在系统上进行工作,所以千万不要强制关机。 同时,为了保护每个人的隐私和工作环境,针对某一个文档(文件、目录),Linux系统定义了三种身份,分别是拥有者(owner

手把手教你怎么撩妹,五分钟读懂!提取于《谈话的力量》

最近撩妹成了一个广受社会青年,尤其是未婚青年们关注的学科。各种理论案例层出不穷。但是,有没有一本像九阴真经一样的撩妹宝典,去指导广大又红又专就是不会说话的热血青年去撩妹撩汉子呢? 有的,这本书就是美国教授艾伦.加纳写的《谈话的力量》 在这本书里,艾伦.加纳虽然讲的是普遍意思上的聊天技巧,但在我看来,完全就是一本撩妹宝典。书中,教授同志提供了十二绝技提高你的撩妹技巧。 第一招:做一个会问问题

每天五分钟计算机视觉:人脸识别网络FaceNet

本文重点 在前面的课程中,为了解决人脸识别的问题,我们学习了Siamese神经网络。本文我们学习另外一种人脸识别网络模型FaceNet。 论文 FaceNet: A Unified Embedding for Face Recognition and Clustering FaceNet概述 FaceNet是谷歌在CVPR 2015上提出的一种深度学习模型,旨在解决人脸识别、验证和

如何五分钟使用 Cocos Creator 快速部署 TON 游戏(第一部分)

TON 生态在游戏赛道的火热,吸引了大量的开发者涌入其中,但从技术角度看,EVM 兼容性以及开发语言等方面的问题,基于 TON 底层建立游戏应用对于很多开发者而言仍旧存在较高的门槛。而 Zypher Network 作为目前最先进的区块链游戏开发引擎,支持将 Web2 游戏拓展为 dApp ,开发了大量插件,支持开发者基于 CocosCreator 开发的游戏能够快速部署在 Telegram 生态

五分钟理解Java的反射API

反射API Java是一种具有反射功能的语言。允许开发人员在运行时检查类型、方法、字段、注解等,并在程序运行时决定是否使用。 为此,Java的反射API提供类,类,字段,构造函数,方法,注释和其他。 使用它们可以与编译时未知的类型进行交互,例如创建未知类的实例并对它们调用方法。 这个快速提示旨在让您深度了解什么是反射,它在Java中的使用,以及它可以用于什么。 之后,你将准备好开始或工作更

五分钟干完三万字!推荐4款可以一键写毕业论文的AI网站

在当前的学术环境中,毕业论文写作是一项既复杂又耗时的任务。然而,随着人工智能技术的发展,许多工具和平台已经能够帮助学生简化这一过程。本文将重点介绍四款可以一键写毕业论文的AI网站,并特别推荐千笔-AIPassPaper。 千笔-AIPassPaper 千笔-AIPassPaper是一款集论文大纲生成、内容填充以及初稿撰写于一体的AI论文写作平台。它融合了先进的AI技术与丰富的学术资源,为用户提

别再自己花大量时间写作了 ,试⼀下用AI五分钟写完一篇文章吧

本文背景 写一篇文章,我们都说“凤头、猪肚、豹尾”写好文 前面两期我们通过自己写作或者AI的协助完成了文章的标题和开头部分,这一期我们再来详细掰头掰头文章的中间部分,也就是猪肚(正文)部分。 无论是议论文,还是说明文,或是记述文,一篇文章的正文必须要充满信息量,像猪的肚子一样,圆润饱满。 让主题充满信息量 围绕主题,想 3 个点 能写到这一部分,就证明我们的标题和开头都已经完成,这篇文章

每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割

本文重点 在深度学习中,我们常常需要完成多个向量拼接,同时也要完成向量的分割,在pytorch中已经有封装好的库,我们可以直接调用完成这部分任务。 Cat拼接 c=torch.cat([a,b],dim=0)表示将a和b按0维度进行拼接,需要注意再非dim维度,两个矩阵的维度必须是一致的,不然会拼接失败。 Stack拼接 Stack并不会进行维度的拼接,而是会增加新的维度 我们

每天五分钟深度学习:逻辑回归算法完成m个样本的梯度下降

本文重点 上节课程我们学习了单样本逻辑回归算法的梯度下降,实际使用中我们肯定是m个样本的梯度下降,那么m个样本的如何完成梯度下降呢? m个样本的损失函数定义为: 我们定义第i个样本的dw、db为: dw和db为损失J对w和b的偏导数,因为m个样本的代价函数J是1到m个样本总损失的平均。所以m个样本代价函数对wj的微分也同样是各项样本损失对wj微分的平均。 对比来说单个样本就是