【数据结构】_5.栈

目录

1. 概念

2. 栈的使用

2.1 方法

2.2 示例

3. 栈的模拟实现

4. 栈的应用场景

4.1 题目1:不可能的出栈序列

4.2 题目2:逆序打印单链表

4.3 题目3:逆波兰表达式求值

4.4 题目4:括号匹配

4.5 题目5:栈的压入、弹出训练

4.6 题目6:最小栈


1. 概念

(1)栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。

(2)进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。

(3)栈中的数据元素遵循后进先出的原则;

(4)压栈:栈的插入操作叫做进栈或压栈或入栈,入数据在栈顶;

         出栈:栈的删除操作叫做出栈,出数据在栈顶;

2. 栈的使用

2.1 方法

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

2.2 示例

    public static void main(String[] args) {Stack<Integer> stack = new Stack<>();for(int i=0;i<=5;i++){stack.push(i);  // 压栈}// 获取栈顶元素System.out.println(stack.peek());Integer a = stack.pop();  // 出栈栈顶元素System.out.println(a);System.out.println(stack.peek());System.out.println(stack.size());}

3. 栈的模拟实现

Stack继承于Vector,查Vector源码可知vector内部用数组实现,故而模拟实现采用数组栈;

(1)包类关系:

(2)MyStack:

package TestMyStack;import java.util.Arrays;public class MyStack {public int[] elem;public int useSize;public MyStack(){this.elem = new int[10];}// 压栈public void push(int val){if(isFull()){// 扩容reSize();}elem[useSize] = val;this.useSize++;}// 判满public boolean isFull(){if(elem.length == this.useSize){return true;}return false;}// 扩容public void reSize(){elem = Arrays.copyOf(elem, 2*elem.length);}// 出栈并返回出栈元素public int pop(){if(isEmpty()){throw new EmptyException();}
//        int val = elem[this.useSize-1];
//        this.useSize--;
//        return val;return this.elem[--this.useSize];}// 判空public boolean isEmpty(){return this.useSize==0;}// 获取栈顶元素public int peek(){return this.elem[this.useSize-1];}
}

(3)EmptyException:

package TestMyStack;public class EmptyException extends RuntimeException{public EmptyException(){}
}

4. 栈的应用场景

4.1 题目1:不可能的出栈序列

若进栈序列为1,2,3,4,进栈过程中可以出栈,则不可能的出栈序列是:C
A. 1,4,3,2   B. 2,3,4,1   C.3,1,4,2    D.3,4,2,1

4.2 题目2:逆序打印单链表

(1)单链表的递归逆序打印法:

 public void fun1(ListNode pHead){// 递归逆序打印单链表if(pHead == null){return;}if(pHead.next == null){System.out.println(pHead.val);}fun1(pHead.next);System.out.println(pHead.val);}

(2)单链表的循环递归逆序打印法:

public void fun2(ListNode pHead){Stack<ListNode> stack = new Stack<>();ListNode cur = head;while(cur!=null){stack.push(cur);cur = cur.next;}// 遍历栈while(!stack.isEmpty()){ListNode top = stack.pop();System.out.print(top.val+" ");}System.out.println();}

4.3 题目3:逆波兰表达式求值

题目链接:150. 逆波兰表达式求值 - 力扣(LeetCode)

解题思路:遍历后缀算数表达式数组,若为数据则入栈,若为算术运算符则出栈栈顶两元素分别作为后操作数和前操作数,再将计算结果入栈,继续向后遍历数组,循环操作,直至栈中仅有一个元素,就是最终值;

代码:

class Solution {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.pop();}private boolean isOperation(String x){if(x.equals("+")||x.equals("-")||x.equals("*")||x.equals("/")){return true;}return false;}
}

4.4 题目4:括号匹配

题目链接:20. 有效的括号 - 力扣(LeetCode)

代码:

class Solution {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 ch2 = stack.peek();   //栈顶元素,必为左括号if(ch2 == '('&& ch == ')' || ch2 == '{' && ch == '}' || ch2 == '[' && ch == ']'){stack.pop();}else{return false;}}}if(!stack.empty()){return false;}return true;}
}

4.5 题目5:栈的压入、弹出训练

题目链接:栈的压入、弹出序列_牛客题霸_牛客网

解题思路:定义i下标遍历pushV,j下标遍历popV,将pushV的元素入栈,当二者元素不相等时,继续入栈pushV元素;当二者元素相等时,出栈栈顶元素,i和j均++;

代码:

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param pushV int整型一维数组 * @param popV int整型一维数组 * @return bool布尔型*/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(j<popV.length && !stack.empty() && stack.peek().equals(popV[j])){stack.pop();j++;}}return stack.empty();}
}

4.6 题目6:最小栈

题目链接:155. 最小栈 - 力扣(LeetCode)

解题思路:为目标栈开辟一个储存最小值的栈,依次遍历目标栈,将最小的元素入栈最小栈,最小栈栈顶元素就是目标栈的最小元素,且能在常数时间内检索到最小元素;

代码:

class MinStack {private Stack<Integer> stack;private 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{   //minStack不为空if(val <= minStack.peek()){  // 如果要插入的值比minStack的栈顶元素小minStack.push(val); // 注意当val==minStack栈顶元素时,也需要将该元素入栈minStack// 因为stack出栈元素时,如果该元素是minStack中的元素,该元素也需要出栈// 以保证在出栈stack最小元素时,minStack中的最小元素不受影响}}}public void pop() {if(!stack.empty()){Integer val = stack.pop();if(val.equals(minStack.peek())){minStack.pop();}// 如果对元素拆箱为int类型,就可使用==进行判等}}public int top() {if(!stack.empty()){return stack.peek();}return -1;}public int getMin() {return minStack.peek();}
}

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

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

相关文章

mysql月统计数据,没有的填充为0

要按时间戳字段按月份分组查询记录表&#xff0c;可以使用DATE_FORMAT函数将时间戳字段格式化为年月格式&#xff0c;然后将结果按照该字段进行分组。 SELECT a.month month,ifnull(b.count, 0) count FROM (SELECT 1 month UNION ALL SELECT 2 month UNION ALL SELECT 3 mont…

Day04-作业(MavenSpringBootWeb入门)

作业1&#xff1a;创建maven工程并配置相关依赖&#xff0c;完成如下需求 需求&#xff1a; 创建三个maven工程&#xff0c;projectA/projectB/projectC&#xff0c;在同一个idea窗口打开 三个maven工程设置依赖&#xff0c;关系入下图所示 作业2&#xff1a;基于SpringBoot…

走进人工智能|自动驾驶 开启智能出行新时代

前言 自动驾驶&#xff0c;也被称为无人驾驶或自动驾驶汽车&#xff0c;是指能够在没有人类干预的情况下自主地感知环境、决策和控制车辆行驶的技术和系统。 文章目录 前言主题发展趋势自动驾驶等级L0级自动驾驶L1级别自动驾驶L2级别自动驾驶L3级别自动驾驶L4级别自动驾驶L5级…

MySQL 在CentOS下安装

yum安装 1、yum源安装 yum install mariadb-server2、启动MySQL服务 systemctl start mariadb3、查看运行状态 systemctl status mariadb4、设置初始密码 mysql -u rootuse mysql;update user set passwordpassword("root")where userroot;flush privileges;e…

【LeetCode】5. 最长回文串

题目链接 文章目录 1. 思路讲解2. 代码实现 1. 思路讲解 与求回文子串思路差别不大 在做这道题目之前&#xff0c;可以先做一下另一道回文子串的题目&#xff0c;如果会了那道求回文子串的题目&#xff0c;这道题基本上也就会了。 回文子串的题解在这里 它也就是求出每一个回…

音乐节《迷笛音乐节》游玩感

上周&#xff0c;去了烟台&#xff0c;参加音乐节&#xff0c;以前从未参加过&#xff0c;所以趁着本周六周日双休的时候&#xff0c;去游玩了一次。&#xff08;1&#xff09;一种新奇体验 对于自己来说&#xff0c;参加音乐节还是一种新奇的体验的&#xff0c;也是疫情放开了…

苍穹外卖day09——历史订单模块(用户端)+订单管理模块(管理端)

查询历史订单——需求分析与设计 产品原型 业务规则 分页查询历史订单 可以根据订单状态查询 展示订单数据时&#xff0c;需要展示的数据包括&#xff1a;下单时间、订单状态、订单金额、订单明细&#xff08;商品名称、图片&#xff09; 接口设计 查询历史订单——代码开…

ChatGPT在法律行业的市场潜力

​ChatGPT现在已经成为我们的文字生成辅助工具、搜索引擎助手&#xff0c;许多体验过它的朋友会发现对它越来越依赖&#xff0c;并将其逐渐融入到自己的日常工作、生活。但有一点值得注意&#xff1a;这种人工智能除了技术可行、经济价值可行还要与相关规范即人类普遍的价值观念…

所有集群启动的命令

所有集群启动的命令 查询所有节点启动Hadoop集群(Yarn模式)关闭Hadoop集群Spark&#xff08;local模式&#xff09;启动Spark集群standalone模式(不用了)关闭standalone模式HA下的standalone模式关闭HA-standalone模式Yarn模式&#xff08;重点&#xff09; 关闭Spark集群启动f…

python_day16_设计模式

“”“单例模式”“” “”“工厂模式”“” class Person:passclass Worker(Person):passclass Student(Person):passclass Teacher(Person):passclass Factory:def get_person(self, p_type):if p_type w:return Worker()elif p_type s:return Student()else:return Te…

【雕爷学编程】MicroPython动手做(25)——语音合成与语音识别2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

偶数科技与白鲸开源完成兼容性认证

近日&#xff0c;偶数科技自主研发的云原生分布式数据库 OushuDB v5.0 完成了与白鲸开源集成调度工具 WhaleStudio v2.0 的兼容性相互认证测试。 测试结果显示&#xff0c;双方产品相互良好兼容&#xff0c;稳定运行、安全&#xff0c;同时可以满足性能需求&#xff0c;为企业级…

Android 自定义按钮(可滑动、点击)

按钮图片素材 https://download.csdn.net/download/Lan_Se_Tian_Ma/88151085 px 和 dp 转换工具类&#xff08;Java&#xff09; // px 和 dp 转换工具类 public class DensityUtil {/*** 根据手机的分辨率从 dip 的单位 转成为 px(像素)*/public static int dip2px(Conte…

【C++】基于多设计模式下的同步异步日志系统

✍作者&#xff1a;阿润021 &#x1f4d6;专栏&#xff1a;C 文章目录 一、项目介绍二、项目实现准备工作1.日志系统技术实现策略2.相关技术知识补充2.1 不定参函数设计2.2 设计模式 三、日志项目框架设计1.模块划分2.各模块关系图 四、详细代码实现1.实用工具类设计2.日志等级…

java -jar指定外部配置文件

场景 spingboot项目部署jar时,需要时常修改配置,为了方便,将配置文件放到jar包外 操作步骤 在jar包同级目录下创建config文件夹(位置没有强制要求,为了方便而已) 在jar包同级目录下创建start.bat文件,并编辑内容 echo off :: 命令窗口标题 title yudibei_performance_tes…

第5章 最佳实践

过去的错误 不要怪罪JavaScript 游览器遇到不合法的html会想尽办法将他展现出来游览器遇到不合法的js将拒绝执行它们并报错写js要保障自己代码的健壮性 质疑一切 写js功能前一定要考虑这个功能的合理性&#xff0c;避免造成不可预见的后果写js功能前一定要考虑用户的游览器…

【Golang】基于录制,自动生成go test接口自动化用例

目录 背景 框架 ginkgo初始化 抓包&运行脚本 目录说明 ∮./business ∮./conf ∮./utils ∮./testcase testcase 用例目录结构规则 示例 实现思路 解析Har数据 定义结构体 解析到json 转换请求数据 转换请求 转换请求参数 写业务请求数据 写gotest测试…

【element-plus】 table表格每行圆角解决方案 element也通用

系列文章目录 【Vue3ViteTselement-plus】使用tsx实现左侧栏菜单无限层级封装 前言 我们在使用element-plus或element 的table时是否有时UI给到的UI效果是如下面这样的&#xff0c;但是我们翻遍了组件库的文档 调整了很多次样式 发现在 左右侧栏固定的时候 普通的方法是完全…

装修小程序,开启装修公司智能化服务的新时代

随着数字化时代的来临&#xff0c;装修小程序成为提升服务质量和效率的关键工具。装修小程序旨在为装修公司提供数字化赋能、提高客户满意度的智慧装修平台。通过装修小程序&#xff0c;装修公司能够与客户进行在线沟通、展示设计方案、提高服务满意度等操作。 装修小程序的好处…

手机pdf转换成word免费版?看看这几个转换方法

手机pdf转换成word免费版&#xff1f;在当今信息化的时代&#xff0c;PDF文档已经成为公文交流、资料分享、学术论文等领域中最常用的文件格式之一。然而&#xff0c;PDF文档的固化特性也使其在文本编辑、内容修改等方面存在不便。因此&#xff0c;将PDF文档转换为Word文档已成…