五分钟“手撕”栈

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

目录

一、实现代码

二、什么是栈

三、栈的常见操作

底层实现是链表。

入栈

出栈 

四、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.rhkb.cn/news/337964.html

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

相关文章

Linux学习笔记(清晰且清爽)

本文首次发布于个人博客 想要获得最佳的阅读体验&#xff08;无广告且清爽&#xff09;&#xff0c;请访问本篇笔记 Linux安装 关于安装这里就不过多介绍了&#xff0c;安装版本是CentOS 7&#xff0c;详情安装步骤见下述博客在VMware中安装CentOS7&#xff08;超详细的图文教…

他人项目二次开发——慎接

接了一个朋友的项目——开发及运营迭代差不多2年多了&#xff0c;整体样子移动端和PC都能正常使用&#xff0c;但后期的扩展性及新功能添加出现瓶颈。 因此给了一部分钱&#xff0c;让我接手来开发——重构架构。 背景说明 朋友公司的技术人员是我帮忙招聘的&#xff0c;相关技…

【设计模式深度剖析】【B】【结构型】【对比】| 主要区别包装的不同

&#x1f448;️上一篇:享元模式 回 顾&#xff1a;结构型设计模式 1.代理模式&#x1f448;️ 2.装饰器模式&#x1f448;️ 3.适配器模式&#x1f448;️ 4.组合模式&#x1f448;️ 5.桥接模式&#x1f448;️ 6.外观模式&#x1f448;️ 7.享元模式&#x…

【EFK日志系统】docker一键部署kibana、es-head

docker一键部署kibana、es-head kibana部署es-head部署 上一篇文章搭建了es集群 规划服务器是 es01:172.23.165.185 es02:172.23.165.186 es03:172.23.165.187 那么kibana就搭建在主节点es01:172.23.165.185 按照顺序参考&#xff1a; docker一键部署EFK系统&#xff08;elas…

洗地机什么牌子好?洗地机前十名排行榜

现代吸拖扫一体洗地机不仅高效&#xff0c;还具有智能化设计&#xff0c;使清洁变得轻松。它强大的吸尘功能能够轻松应对灰尘和碎屑&#xff0c;不论是硬质地面还是地毯&#xff0c;都能提供理想的清洁效果。配合拖地功能&#xff0c;通过内置水箱和智能拖布&#xff0c;能彻底…

代码随想录-Day25

216.组合总和III 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输…

C语言 | Leetcode C语言题解之第120题三角形最小路径和

题目&#xff1a; 题解&#xff1a; int minimumTotal(int** triangle, int triangleSize, int* triangleColSize) {int f[triangleSize];memset(f, 0, sizeof(f));f[0] triangle[0][0];for (int i 1; i < triangleSize; i) {f[i] f[i - 1] triangle[i][i];for (int j …

Redis数据类型(上篇)

前提&#xff1a;&#xff08;key代表键&#xff09; Redis常用的命令 命令作用keys *查看当前库所有的keyexists key判断某个key是否存在type key查看key是什么类型del key 删除指定的keyunlink key非阻塞删除&#xff0c;仅仅将keys从keyspace元数据中删除&#xff0c;真正的…

如何获取SSL证书,消除网站不安全警告

获取SSL证书通常涉及以下几个步骤&#xff1a; 选择证书颁发机构&#xff08;CA&#xff09;&#xff1a; 你需要从受信任的SSL证书颁发机构中选择一个&#xff0c;比如DigiCert、GlobalSign、JoySSL等。部分云服务商如阿里云、腾讯云也提供免费或付费的SSL证书服务。 生成证…

电子烟开发【恒压、恒有效算法】

恒压算法 pwm是通过软件模拟的 pwm满值运行是250全占空比 #define D_TARGET_AVERAGE_VOLTAGE 3500 //R_ADC1_Vout &#xff1a;发热丝两端AD值 //R_ADC_FVR &#xff1a;电池电压AD值 //FVR_VOLTAGE &#xff1a;电池AD参考电压 满电值AD //R_Smk1Duty &#xff1a;最后…

uniapp创建支付密码实现(初始密码,第二次密码)

示例&#xff1a; 插件地址&#xff1a;自定义数字/身份证/密码输入框&#xff0c;键盘密码框可分离使 - DCloud 插件市场 1.下载插件并导入HBuilderX&#xff0c;找到文件夹&#xff0c;copy number-keyboard.vue一份为number-keyboard2.vue&#xff08;number-keyboard.vue是…

详细介绍运算符重载函数,清晰明了

祝各位六一快乐~ 前言 1.为什么要进行运算符重载&#xff1f; C中预定义的运算符的操作对象只能是基本数据类型。但实际上&#xff0c;对于许多用户自定义类型&#xff08;例如类&#xff09;&#xff0c;也需要类似的运算操作。这时就必须在C中重新定义这些运算符&#xff…

Centos 7 安装刻录至硬件服务器

前言 在日常测试中&#xff0c;会遇到很多安装的场景&#xff0c;今天给大家讲一下centos 7 的安装&#xff0c;希望对大家有所帮助。 一.下载镜像 地址如下&#xff1a; centos官方镜像下载地址https://www.centos.org/download/ 按照需求依次点击下载 二.镜像刻录 镜像刻…

C++语言·list链表(下)

还是之前说的&#xff0c;因为要写模板&#xff0c;为了避免链接出现问题&#xff0c;我们将所有内容都写到一个文件中去。首先就是画出链表的框架 链表本身只需要一个头节点就足以找到整条链表&#xff0c;而需要它拼接的节点我们再写一个模板。而我们知道list是一个带头双向循…

微信小程序对接发货功能

注&#xff1a;微信小程序对接发货功能 文档地址&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order-shipping/order-shipping.html php代码 common.php use think\Config; use think\Db; use fast\Http; us…

OrangePi AIpro 变身 Android 打包机

主板基本信息介绍 OrangePi AIpro&#xff0c;是香橙派联合华为精心打造&#xff0c;建设人工智能新生态而设计的一款开发板&#xff0c;这次为大家分享下我上手的这款 OrangePi AIpro 8GB&#xff08;算力达8TOPS&#xff09; 的一些小小的经验。 基本参数如下&#xff1a; …

【Keil 5】Keil 5下载安装激活到2032年(含MDK、C51、STM32单片机)+附带百度网盘链接

这里写目录标题 安装包、激活文件下载1.双击mdk 514开始安装2.一路点next&#xff0c;信息随便写即可3.激活4.安装STM325.激活c51 安装包、激活文件下载 解压密码&#xff1a;lantongxue 链接&#xff1a;https://pan.baidu.com/s/15Aukt0j1HCFyHBE6whuDeg?pwdsjyh 提取码&…

FreeRtos进阶——中断的内部逻辑

中断与非中断API的区别 BaseType_t xQueueSendToBack(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait); BaseType_t xQueueSendToBackFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWok…

OceanBase 内存研究(OceanBase 3.2.4.5)

内存结构 从官网的结构图可以看出&#xff0c;一台observer可使用的总内存(memory_limit)包括 系统内存(system_memory) 和 租户内存(sys租户与普通租户) 系统内存 系统内存system_memory 属于 observer 的内部内存&#xff0c;允许其它租户共享使用该内存资源 (root10.0.0.…

丛林生存法则其实就两个字:输出

不管你是在上班&#xff0c;还是在灵活就业&#xff0c;现在的大环境下&#xff0c;你要想活下来&#xff0c;生存下去&#xff0c;一定要记住这两个字&#xff1a;输出。如果你能记住更多的字&#xff0c;那便是持续高水平的输出。 你如果是大厂程序员&#xff0c;你肯定发现…