当前位置: 首页 > news >正文

了解栈Stack一篇文章就够了

  1. 什么是栈

栈是一种特殊的线性表,只允许一端进行数据的插入和删除,即先进后出原则。类似于弹夹先装进去的子弹后面出,后放入的子弹先出。

  1. 栈的底层原理

栈是一种线性结构,所以既能使用数组实现,也能使用链表实现,我就采用数组的方法实现一下栈
public class MyStack {public int[] elem;private static final int DEFAULT_CAPACITY = 10;public MyStack() {elem = new int[DEFAULT_CAPACITY];}//既能统计栈中存储多少个有效数据,也可以作为存放元素的下标public int usedSize;//压栈public void push(int val) {//先判满,如果满了要扩容if(isFull()) {elem = Arrays.copyOf(elem, elem.length * 2);}elem[usedSize] = val;usedSize++;}private boolean isFull() {return usedSize == elem.length;}//出栈public int pop() {//先判空,如果栈为空抛出异常if(empty()) {throw new EmptyArrayException("栈为空");}int val = elem[usedSize-1];usedSize--;return val;}private boolean empty() {return usedSize == 0;}//查看栈顶元素public int peek() {if(empty()) {throw new EmptyArrayException("栈为空");}return elem[usedSize-1];}//获取栈中有多少元素public int getUsedSize() {return usedSize;}
}
使用数组的实现方式,入栈只需要elem[usedSize] = data和出栈只需要usedSize--的时间复杂度都是O(1)。
如果使用单向链表,采用头插法入栈和出栈,只需要移动head头节点,时间复杂度也是O(1);要是采用尾插法入栈和出栈,入栈和出栈都需要从头节点出发,走到尾巴,才能完成元素的入栈或出栈,时间复杂度为O(n).
如果是双向链表,那么一个节点即知道后继节点,也知道前驱节点,有头节点head也有尾节点tail,采用头插法进行入栈和出栈只需要移动head头节点,采用尾插法进行入栈和出栈也是一样,只需要移动tail尾巴节点。
  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
方法:按题目给的入栈顺序,结合选项,加画图(熟练以后不用画图)
A选项:第一个出栈是1,所以1进栈后出栈,2进栈,3进栈(因为出栈的第二个是4,所以2,3没有出栈),4进栈。4出栈,3出栈,2出栈。所以A是可能的出栈序列
B选项:B选项第一个出栈的是2,所以1进栈2进栈,2出栈,3进栈3出栈,4进栈4出栈,此时栈还剩1,1出栈。也是可能的出栈序列
C选项:你看C选项第一个出栈的是3,所以1,2,3都进栈,3再出栈,它第二个出栈的是1,但是此时栈顶元素是2,所以这是不可能的出栈顺序
D选项:第一个出栈的是3,所以要1,2,3都入栈了,3是栈顶元素才能出栈,接着4入栈,4又出栈,然后把栈中2出栈,1出栈

有关出栈顺序的oj题: https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId=13&&tqId=11174&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

public class Solution {public boolean IsPopOrder(int [] pushA, int [] popA) {Stack<Integer> stack = new Stack<>();int index = 0;//popA数组下标//遍历压栈pushA数组for (int i = 0; i < pushA.length; i++) {stack.push(pushA[i]);//如果栈顶元素和popA[index]相等//并且要防止栈为空(空指针异常)和数组越界//使用循环可能连着多个相等while (!stack.empty() && index < popA.length && stack.peek() == popA[index]) {stack.pop();index++;}}//如果是可能的出栈序列,那么栈中的元素能全部匹配,全部被弹出//如果栈不为空,说明是不可能的出栈序列return stack.empty();}
}
  1. 中缀表达式转后缀表达式

题目1:中缀表达式:2+3*6的后缀表达式?
题目2 :中缀表达式:(2+3)*5的后缀表达式
中缀转后缀,我们是加括号,然后把操作符移到对应括号后面,再去括号。同理,中缀转前缀,就是把操作符移到括号前面
  1. 求后缀表达式/逆波兰表达式的计算结果

力扣Oj: https://leetcode.cn/problems/evaluate-reverse-polish-notation/

解决方法:使用栈,将数字放入栈中,如果碰到操作符,取出栈顶的2个元素,第一个取出的放操作符右边,第二个取出放操作符左边(固定的),计算完了再放入栈中,直到遍历完该字符串数组,此时栈中元素的值就是结果
class Solution {public int evalRPN(String[] tokens) {//等会要进行运算,类型用IntegerStack<Integer> stack = new Stack<>();//遍历数组for(String x: tokens) {//判断是不是数字字符串if(! isOperation(x)) {//如果是数字字符串,入栈stack.push(Integer.parseInt(x));//转为数字}else {//碰到操作符,出栈2个数int num1 = stack.pop();int num2 = stack.pop();//根据不同操作字符,进行运算,第一个弹出放操作符右边,第二个放左边//运算完后,重新入栈switch(x) {case "+" :stack.push(num2 + num1);break;case "-" :stack.push(num2 - num1);break;case "*":stack.push(num2 * num1);break;case "/" :stack.push(num2 / num1);break;} }}//此时栈中元素就是运算结果return stack.pop();}private boolean isOperation(String x) {//字符串比较不能使用==,==是比较地址,而不是比较值//字符串重写了Object类的equals()方法,是比较值的if(x.equals("+") || x.equals("-") || x.equals("*") || x.equals("/")) {return true;//如果是操作符返回真}return false;//不是返回假}
}

相关文章:

了解栈Stack一篇文章就够了

什么是栈栈是一种特殊的线性表&#xff0c;只允许一端进行数据的插入和删除&#xff0c;即先进后出原则。类似于弹夹先装进去的子弹后面出&#xff0c;后放入的子弹先出。栈的底层原理栈是一种线性结构&#xff0c;所以既能使用数组实现&#xff0c;也能使用链表实现&#xff0…...

CNStack 助推龙源电力扛起“双碳”大旗

作者&#xff1a;CNStack 容器平台、龙源电力&#xff1a;张悦超 、党旗 龙源电力容器云项目背景 龙源电力集团是世界第一大风电运营商&#xff0c; 随着国家西部大开发战略推进&#xff0c;龙源电力已经把风力发电场铺设到全国各地&#xff0c;甚至是交通极不便利的偏远地区&…...

ruoyi-vue-plus1(控制台相关的输出日志)(p6spy插件)(jackson全局配置)(StopWatch)

Jackson配置在启动项目时&#xff0c;我们发现日志打印出这样几行字&#xff0c;初始化了jacdson配置&#xff0c;我们去查看一下来源找。我们找到了一个全局序列化配置类&#xff0c;其中重写了BigNumberSerializer.INSTANCE进去查看发现了这里对于部分范围的数字进行了转为为…...

【Mybatis】| 如何创建MyBatis的工具类

目录&#x1f31f;更多专栏请点击&#x1f447;一、前言二、实现过程1. 创建一个ThreadLocal对象2. 初始化SqlSessionFactory3. 获取并存储sqlSession对象4. 关闭sqlSession对象三、 总代码&#x1f31f;更多专栏请点击&#x1f447; 专栏名字&#x1f525;Elasticsearch专栏e…...

【Java】DT怎么写?

几个重要的注解 怎么用mockito写单元测试&#xff1f; package Biz;import Client.FileIOClient; import Req.FileRequest; import Res.FileResponse; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks;…...

xcode14安装swift package设置github账户token

这里写目录标题登录github账户,复制token打开xcode添加github账户选择swift package登录github账户,复制token 登录github点击上面菜单自己的头像,settings->Developer settings->Personal access tokens->Tokens (classic)->Generate new token (classic) Note名…...

css面试题1

一、css 1. 说一下css的盒模型 在HTML中所有元素都可以看成是一个盒子 盒子的组成&#xff1a; 内容content、内边距padding、边框border、外边距margin 盒模型的类型&#xff1a; 标准盒模型 margin border padding content IE盒模型 margin content(border padding) 控制…...

Hive基础

hive基本语法&#xff1a;查看数据库&#xff1a;hive (default)> show databases; -----查看所有数据库hive (default)> desc database test; ----查看数据库结构hive (default)> select current_database(); ---查看当前数据库创建数据库&#xff1a;hive (default)…...

信息收集-

url&#xff1a; https://en.wikipedia.org:443/wiki/hypertext_Transfer_Protocol?id123#HTTP/1.1_response_messages https&#xff1a;协议 en.wikipedia.org&#xff1a;域名 443&#xff1a;端口 wiki/hypertext_Transfer_Protocol&#xff1a;文件路径 id123&…...

【sdx12】sdx12获取Serial Number操作方法及源码分享Serial Number的寄存器地址

通过串口获取 系统启动时,在boot阶段会打印如下信息 Format: Log Type - Time(microsec) - Message - Optional Info Log Type: B - Since Boot(Power On Reset), D - Delta, S - Statistic S - QC_IMAGE_VERSION_STRING=BOOT.XXXX S - IMAGE_VARIANT_STRING=MAATANAZA S - …...

23种设计模式-工厂模式(安卓应用场景介绍)

工厂模式是一种创建型设计模式&#xff0c;它提供了一种创建对象的方式&#xff0c;而无需将具体的对象创建逻辑暴露给客户端。在Java中&#xff0c;工厂模式常常用于创建复杂对象或对象的构造过程涉及到多个步骤的情况。 在Android开发中&#xff0c;工厂模式也经常被使用&am…...

sheng的学习笔记-服务熔断与降级组件Hystrix

在微服务架构中&#xff0c;一个应用往往由多个服务组成&#xff0c;这些服务之间相互依赖&#xff0c;依赖关系错综复杂。例如一个微服务系统中存在 A、B、C、D、E、F 等多个服务&#xff0c;它们的依赖关系如下图。图1&#xff1a;服务依赖关系通常情况下&#xff0c;一个用户…...

简单给WordPress怎么添加自定义字段面板

今天一淘模板(56admin.com)WordPress怎么添加自定义字段面板&#xff1f;下面本篇文章给大家介绍一下WordPress添加自定义字段面板的方法&#xff0c;希望对大家有所帮助&#xff01; 我们在WordPress中编写文章的时候&#xff0c;经常会用到一些自定义字段&#xff0c;如网页描…...

大数据框架之Hive:第6章 查询

第6章 查询 6.1 基础语法 1&#xff09;官网地址 https://cwiki.apache.org/confluence/display/Hive/LanguageManualSelect 2&#xff09;查询语句语法&#xff1a; SELECT [ALL | DISTINCT] select_expr, select_expr, ...FROM table_reference -- 从什么表查[WHE…...

CentOS 8搭建EMQX集群

概览 EMQX (opens new window)是一款大规模可弹性伸缩的云原生分布式物联网 MQTT (opens new window)消息服务器。 EMQ X 设计目标是实现高可靠&#xff0c;并支持承载海量物联网终端的MQTT连接&#xff0c;支持在海量物联网设备间低延时消息路由: 1. 稳定承载大规模的 MQTT 客…...

基于神经网络的自监督学习方法音频分离器(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 神经网络的输入是混合&#xff08;男性女性&#xff09;音频的振幅谱。神经网络的输出目标是男性说话者理想的软掩模。损失函数…...

yocto 如何添加python module

yocto 如何添加python module 最近在使用阿里云的图像识别SDK&#xff0c;在ubuntu主机上使用pip install alibabacloud_imagerecog20190930 安装modules以后就可以运行demo程序了&#xff0c;于是打算将SDK移植到嵌入式板子上面&#xff0c;然后在板子上跑一下demo。但是发现…...

[深入理解SSD系列综述 2.1.2] SLC、MLC、TLC、QLC、PLC NAND_固态硬盘闪存颗粒类型

闪存最小物理单位是 Cell, 一个Cell 是一个晶体管。 闪存是通过晶体管储存电子来表示信息的。在晶体管上加入了浮动栅贮存电子。数据是0或1取决于在硅底板上形成的浮动栅中是否有电子。有电子为0,无电子为1. SSD 根据闪存颗粒区分,固态硬盘有SLC、MLC、TLC、QLC、PLC 五种类型…...

Matlab实现FFT变换

Matlab实现FFT变换 文章目录Matlab实现FFT变换原理实现手算验证简单fft变换和频谱求取功率谱结论在信号处理中&#xff0c;快速傅里叶变换&#xff08;FFT&#xff09;是一种非常常见的频域分析方法。本文将介绍如何使用Matlab实现FFT变换&#xff0c;并通过Matlab代码演示实际…...

JVM调优面试题——垃圾回收专题

文章目录1、如何确定一个对象是垃圾&#xff1f;1.1、引用计数法1.2、可达性分析2、对象被判定为不可达对象之后就“死”了吗&#xff1f;3、都有哪些垃圾收集算法&#xff1f;3.1、 标记-清除(Mark-Sweep)3.2、标记-复制(Mark-Copying)3.3、标记-整理(Mark-Compact)3.4、分代收…...

避坑指南:新到手的NUC 13装Ubuntu,WiFi驱动对了但图标不显示?可能是AX211网卡在Linux下的‘通病’

NUC 13安装Ubuntu后WiFi图标消失的深度排查与解决方案 刚拿到手的Intel NUC 13装上Ubuntu系统&#xff0c;WiFi驱动看似正常却不见图标&#xff1f;这可能是AX211网卡在Linux下的"通病"。作为一名长期与硬件兼容性问题打交道的技术顾问&#xff0c;我遇到过太多类似…...

【vue】二、vue2仿去哪儿网app——首页开发实战:从零搭建到性能优化

1. 项目初始化与页面结构设计 开始一个Vue2仿去哪儿网App首页项目&#xff0c;首先要搭建基础框架。我习惯用vue-cli脚手架快速初始化项目&#xff0c;这个工具能帮我们处理好webpack配置、基础目录结构等繁琐工作。执行vue init webpack qunar-app命令后&#xff0c;会生成标…...

Phi-4-mini-reasoning企业级落地:金融风控规则推理引擎构建案例

Phi-4-mini-reasoning企业级落地&#xff1a;金融风控规则推理引擎构建案例 1. 项目背景与模型介绍 在金融风控领域&#xff0c;规则推理引擎是核心决策系统的重要组成部分。传统规则引擎往往面临维护成本高、灵活性差、难以应对复杂场景等问题。Phi-4-mini-reasoning作为一款…...

Graphormer部署案例:中小企业AI药物研发团队低成本GPU算力部署方案

Graphormer部署案例&#xff1a;中小企业AI药物研发团队低成本GPU算力部署方案 1. 项目背景与价值 在药物研发领域&#xff0c;分子属性预测是核心环节之一。传统实验方法成本高昂且周期漫长&#xff0c;而Graphormer作为基于纯Transformer架构的图神经网络&#xff0c;为这一…...

告别轮询!用STM32F407的USART3+DMA+空闲中断实现高效串口数据接收

STM32F407高效串口通信&#xff1a;USART3DMA空闲中断实战指南 在嵌入式开发中&#xff0c;串口通信是最基础也最常用的外设之一。传统的中断接收方式虽然简单&#xff0c;但在高速或大数据量传输时&#xff0c;频繁的中断响应会显著增加CPU负担&#xff0c;甚至导致数据丢失。…...

告别手动重复!用Python+ArcPy实现多要素批量裁剪年度影像的保姆级教程

PythonArcPy自动化遥感影像裁剪&#xff1a;从原理到实战的完整解决方案 遥感影像处理是GIS工程师的日常必修课。每当拿到新一年的土地利用数据或行政区划影像时&#xff0c;最头疼的莫过于要为每个行政单元单独裁剪每年的数据。我曾花费整整一周时间手动处理30个乡镇5年的NDVI…...

终极指南:如何在NixOS上完美打包与使用SilentSDDM主题

终极指南&#xff1a;如何在NixOS上完美打包与使用SilentSDDM主题 【免费下载链接】SilentSDDM A very customizable SDDM theme that actually looks good. 项目地址: https://gitcode.com/gh_mirrors/si/SilentSDDM SilentSDDM是一款高度可定制且视觉精美的SDDM登录主…...

Axelspace 太空公司牵头联合体入选日本太空战略基金项目 “提升下一代地球观测卫星能力技术”

—— 通过卫星星座与航空器开展特定排放源二氧化碳排放与吸收监测&#xff0c;打造气候解决方案&#xff0c;开拓全新市场机遇 Axelspace 太空公司、明星电气株式会社、全日空控股株式会社及 JIJ 株式会社联合宣布&#xff0c;各方共同申报的技术研发项目成功入选日本宇宙航空…...

实体店有没有必要做门店小程序?

在当前消费行为不断向线上延伸的背景下&#xff0c;实体店是否需要搭建门店小程序&#xff0c;已经成为很多经营者在数字化转型过程中必须面对的问题。实体店是否有必要做门店小程序&#xff0c;取决于其是否需要提升获客能力与用户复购效率。一、为什么会出现这个问题在实际经…...

COMSOL 6.2有限元仿真模型:“1-3压电复合材料厚度共振模态、阻抗相位曲线、表面位移仿...

COMSOL有限元仿真模型_1-3压电复合材料的厚度共振模态、阻抗相位曲线、表面位移仿真。 材料的几何参数可任意改变 版本为COMSOL6.2&#xff0c;低于此版本会打不开文件 ps&#xff1a;支持超声、光声、压电等相关内容仿真代做搞压电复合材料仿真最头疼的就是参数调麻了——厚度…...