Java实现栈

一、栈Stack

1.1 概念

一种特殊的线性表,只允许在固定的一段进行插入和删除元素操作。进行数据的插入和删除操作的一段称为栈顶,另一端称为栈低。栈中的元素遵循后进先出 LIFO(Last In First Out)的原则。

进栈
出栈

举例:在word中,如果要想进行添加、删除。修改相关信息,则当用户选择撤销时,程序将会返回上一个操作状态。

1.2 栈的使用

栈的方法及其功能

方法

功能
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 栈顶元素为3if(s.empty()){System.out.println("栈空");}else{System.out.println(s.size());}
}

1.3 模拟实现栈

Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的.

public class MyStack {public int[] elem;public int usedSize;public MyStack() {this.elem = new int[10];}public void push(int val) {if(isFull()) {this.elem = Arrays.copyOf(elem,2*elem.length);}elem[usedSize++] = val;}private boolean isFull() {return usedSize == elem.length;}public int pop() {if(isEmpty()) {throw new EmptyStackException("pop()空栈异常");}int val = elem[usedSize - 1];usedSize--;return val;}public int peek() {if(isEmpty()) {throw new EmptyStackException("peek()空栈异常");}return elem[usedSize - 1];}private boolean isEmpty() {return usedSize == 0;}
}

1.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

解析:错误出栈序列的解析如下,正确出栈序列解析同下

2.一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出栈的顺序是( )。

A: 12345ABCDE     B: EDCBA54321      C: ABCDE12345      D: 54321EDCBA

解析:根据栈中元素遵循先进后出的原则,得出栈顺序为EDCBA54321

2. 将递归转化为循环链表

// 递归方式
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 + " ");}
}

3. 括号匹配

首先,判断获取的字符是否是左括号,如果是则插入到栈中;如果栈为空则返回false;如果前两种情况都不是,则此时为右括号,然后判断栈顶元素和当前字符进行匹配,若满足条件则删除栈顶元素,否则返回false。最后当字符串遍历完后,如果栈中还有元素,则此时左括号多,返回false。如果栈为空,则返回true。

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);//如果ch为左括号,则放入栈中if(ch == '(' || ch == '[' || ch == '{' ) {stack.push(ch);}else {//此时ch为右括号//情况1:栈中没有左括号进行匹配,右括号多if(stack.isEmpty()){return false;}//情况2:栈中右左括号,需判断栈顶ch2(右括号)是否和ch(右括号)匹配char ch2 = stack.peek();if( ch2 == '(' && ch == ')' || ch2 == '[' && ch == ']' || ch2 == '{' && ch == '}' ) {stack.pop();}else {//此时,栈不为空,但括号不匹配return false;}}}//字符串已经遍历完了,若栈不为空,则左括号多if(!stack.isEmpty()) {return false;}return true;}
}

4. 逆波兰表达式

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for(String str : tokens) {if(isNumber(str)) {int x = Integer.parseInt(str);stack.push(x);}else {int val2 = stack.pop();int val1 = stack.pop();switch (str) {case "+":stack.push(val1 + val2);break;case "-":stack.push(val1 - val2);break;case "*":stack.push(val1 * val2);break;case "/":stack.push(val1 / val2);break;}}}return stack.pop();}private boolean isNumber(String str) {return !(str.equals("+")|| str.equals("-" )|| str.equals("*")|| str.equals("/"));}
}

5. 出栈入栈次序匹配

解析:遍历pushV数组,每次入栈一个元素后,将栈顶元素与popV中下标为j所对应的元素进行比较,如果一样,则可以出栈;不一样,i++。在遍历时,可能会出现多个相同,所以需用到循环

public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param pushV int整型一维数组 * @param popV int整型一维数组 * @return bool布尔型*/public boolean IsPopOrder (int[] pushV, int[] popV) {// write code hereStack<Integer> stack = new Stack<>();int j = 0;for(int i = 0;i < pushV.length;i++) {stack.push(pushV[i]);while(!stack.empty() && j < popV.length && stack.peek() == popV[j]) {stack.pop();j++;}}return stack.empty();}
}

6.最小栈

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

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

同等学力英语考试成绩在哪里查询

同等学力英语考试成绩可以通过中国教育考试网进行查询。 具体查询步骤如下&#xff0c;访问中国教育考试网的官方网站 在网站首页找到“考生服务”板块 点击“成绩查询”输入报考时的姓名、证件号码和验证码&#xff0c;点击“查询”按钮进行成绩查询。

前瞻产业研究院联合发布:2024年中国AI大模型场景应用探索及应用调研报告 高清版PDF!!!

前言 这份文档是《2024年中国AI大模型场景探索及产业应用调研报告》&#xff0c;由深圳前瞻产业研究院、首钢基金CANPLUS联合华为云共同出品。报告主要探讨了中国AI大模型在不同行业场景中的应用现状、痛点、解决方案以及未来的发展趋势和投资机会。 核心内容总结如下&#xf…

从入门到精通:Linux 100个关键技术关键词

无论你是刚刚接触Linux的新手&#xff0c;还是希望进一步提升技能的中级用户&#xff0c;本指南都将是你不可或缺的学习资源。Linux 是一个强大而灵活的开源操作系统&#xff0c;广泛应用于服务器、嵌入式系统和个人电脑。通过掌握本指南中的100个关键技术关键词&#xff0c;你…

canvas分享,从入门到入门。

开始之前 canvas是一个可以使用脚本在其中绘制图形的 HTML 元素.它本身并不具备绘图能力&#xff0c;需要配合JavaScript使用 用途 游戏应用特效字体相册&#xff0c;幻灯片股票行情等动态图像思维图以及图形编辑器等在线可视化工具 基本特性 canvas元素会初始化宽度为300像…

Windows驱动调试方法

单步调试驱动 驱动的调试不能直接在本机上进行&#xff0c;而是要放在虚拟机&#xff08;或其它设备&#xff09;中。这是因为在内核模式下&#xff0c;一个断点的触发将会停下整个系统而不只是单个进程。 在前面的文章里&#xff0c;使用了DbgPrint函数来进行日志的输出&…

西门子S7-1200 PLC的配方功能

配方相关指令介绍工控人加入PLC工业自动化精英社群 配方功能主要使用4个指令&#xff0c;READ_DBL和WRIT_DBL用于对配方数据块的读写&#xff0c;RecipeExport和RecipeImport用于配方数据块和CSV文件之间的转化&#xff0c;下面分别介绍这4个指令的使用。 READ_DBL / / / / …

【更新】全国地级市胡焕庸线、长江经济带、地域划分数据

本次数据是地级市的胡焕庸线、长江经济带、地域划分数据&#xff1a; 1、胡焕庸线是一条经典的地理分割线&#xff0c;它区分了中国人口分布的稠密区与稀疏区&#xff0c;东南部地区人口密集&#xff0c;西北部地区则较为稀疏 2、长江经济带是指沿长江流域分布的经济区域&…

C++ STL容器(三) —— 迭代器底层剖析

本篇聚焦于STL中的迭代器&#xff0c;同样基于MSVC源码。 文章目录 迭代器模式应用场景实现方式优缺点 UML类图代码解析list 迭代器const 迭代器非 const 迭代器 vector 迭代器const 迭代器非const迭代器 反向迭代器 迭代器失效参考资料 迭代器模式 首先迭代器模式是设计模式中…

hadoop大数据平台操作笔记(上)

Hadoop介绍 Hadoop是一个开源的分布式系统框架&#xff0c;专为处理和分析大规模数据而设计。它由Apache基金会开发&#xff0c;并通过其高可靠性、高扩展性、高效性和高容错性等特性&#xff0c;在大数据领域发挥着重要作用。以下是对Hadoop的详细解释及其用途的概述&#xf…

Mybatis进阶

一、日志管理 mybatis主要使用logback来管理日志&#xff0c;具体内容之前的java进阶有说&#xff0c;链接如下 java基础进阶——log日志、类加载器、XML、单元测试、注解、枚举类_java logs是什么意思-CSDN博客 二、动态SQL 动态SQL指的是根据参数数据动态组织SQL的技术。 …

Qt获取本机Mac地址、Ip地址

一、简述 今天给大家分享一个获取本机IP地址和Mac地址的方法&#xff0c;经过多次测试&#xff0c;台式机、笔记本等多个设备&#xff0c;暂时没有发现问题。 由于很多时候本地安装了虚拟机、蓝牙、无线网卡或者其他设备等&#xff0c;会有多个Mac地址&#xff0c;所以需要进…

SQL Server2012保姆安装教程----带你快速上手数据库创建

目录 1.前言 2.安装准备 3.参考文章 4.安装过程 5.快速上手 5.1如何连接服务器 5.2创建数据库 5.3添加新的文件 5.4属性介绍 5.5创建表的引入 1.前言 我之前使用的就是mysql数据库&#xff0c;这个数据库使用的比较多&#xff0c;我学的初期也是这个&#xff1b; 但是…

虚拟机使用FileZilla软件实现文件互传

软件版本&#xff1a;FizeZilla 3.63.2 VirtualBox7.0.20 1.设置桥接模式(网卡) 2.查看ip 在控制台输入ifconfig 3.在终端打开控制台安装FTP服务 sudo apt-get install vsftpd 等待软件自动安装&#xff0c;安装完成以后使用 VI命令打开 /etc/vsftpd.conf&#xff0c;命令…

Kali 联网

VMware 中分三种网络模式 桥接模式&#xff1a;默认余宿主机 VMnet0 绑定&#xff0c;像一台独立机 NAT 模式&#xff1a;默认余宿主机 VMnet8 绑定&#xff0c;需要通过物理机连接外网 仅主机模式&#xff1a;默认余宿主机 VMnet1 绑定&#xff0c;只能与物理机通信 VMware…

3. 轴指令(omron 机器自动化控制器)——>MC_MoveVelocity

机器自动化控制器——第三章 轴指令 6 MC_MoveVelocity变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启运动指令▶多重启动运动指令▶异常 动作示例▶动作示例▶梯形图▶结构文本(ST) MC_MoveVelocity 使用伺服驱动器的位置控制模式&#xff0c;进行…

股价已暴涨64000%,估值比英伟达还高,Costco股票还能投资吗?

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;自1985年上市以来&#xff0c;Costco的股价已经上涨了64,000%以上。 &#xff08;2&#xff09;该公司已成为了美股市场上最被高估的公司之一&#xff08;估值比英伟达还高&#xff09;。 &#xff08;3&#xff09;猛兽…

八大排序——万字长文带你剖析八大排序(C语言)

本篇文章主要介绍八大排序的思想和具体实现&#xff0c;也会分析具体的时间复杂度和空间复杂度&#xff0c;提醒一些容易出现的坑和实现一些不同版本的排序&#xff0c;以及这些不同排序之间的效率分析 目录 1.插入排序 1.1直接插入排序 1.1.1 直接插入排序的思想&#xff…

linux 下的静态库与动态库

目录 一、介绍 1、静态库 2、动态库 二、操作 1、静态库 2、动态库 3、使用库文件 &#xff08;1&#xff09;方法一 &#xff08;2&#xff09;方法二 &#xff08;3&#xff09;方法三 一、介绍 1、静态库 静态链接库实现链接操作的方式很简单&#xff0c;即程序文…

【2024W38】肖恩技术周刊(第 16 期):白嫖AI的最佳时段

周刊内容: 对一周内阅读的资讯或技术内容精品&#xff08;个人向&#xff09;进行总结&#xff0c;分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率&#xff0c;每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

同等学力申硕英语网课如何选择

很多考生想知道同等学力申硕英语网课如何选择&#xff0c;小编告诉大家&#xff0c;首先明确自己的学习目标和需求是为了提高口语、阅读、写作还是听力能力? 只有明确了自己的学习目标和需求&#xff0c;才能更好地选择适合自己的课程和平台。 二、选择知名品牌和口碑良好的平…