【数据结构】栈

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:浅谈数据结构
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖

栈-Stack

  • 1. 什么是栈
  • 2. 栈的使用
  • 3. 栈的模拟实现
  • 4. 栈的应用场景

在这里插入图片描述

1. 什么是栈

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

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶。

在这里插入图片描述

现实生活中也有很多栈的例子:
在这里插入图片描述

2. 栈的使用

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

上述方法的实现:

import java.util.Stack;
public class Main {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());}}
}    

3. 栈的模拟实现

从下图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。
在这里插入图片描述

模拟实现栈:

public class MyStack{private int[] elem;private int usedSize;//可以存放数据元素的下标private static final int DEFAULT_CAPACITY = 10;//默认容量public MyStack() {elem = new int[DEFAULT_CAPACITY];}//入栈public void push(int x) {if(full()) {elem = Arrays.copyOf(elem,2*elem.length);//扩容}elem[usedSize] = x;usedSize++;}//判断栈满public boolean full() {if(usedSize == elem.length) {return true;}return false;}//出栈public int pop() {if(empty()) {throw new EmptyException("栈空了!");}int old = elem[usedSize-1];usedSize--;//相当于是删除return old;}//返回栈顶元素public int peek() {if(empty()) {throw new EmptyException("栈空了!");}return elem[usedSize-1];}//计算入栈元素长度public int size() {return usedSize;}//判断栈空public boolean empty() {return usedSize == 0;}
}

4. 栈的应用场景

  1. 改变元素序列
  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

第一题答案为C。在序列进栈时,也可以有元素出栈,于是出栈的序列就有:1,2,3,4;1,4,3,2;2,3,4,1;3,4,2,1等等。C选项中,3先出栈,栈顶元素变为2,1不可能先出。
在这里插入图片描述
第二题答案为B,序列全部进栈,然后按照后进先出原则出栈。

  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. 括号匹配
    给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s,判断字符串是否有效。
    有效字符串需满足:
    (1)左括号必须用相同类型的右括号闭合。
    (2)左括号必须以正确的顺序闭合。
    (3)每个右括号都有一个对应的相同类型的左括号。
    类似于:(([]{}))、{[()]}、([])、()[]{}…

解题思路:
在这里插入图片描述
代码实现:

public boolean isValid(String s) {Stack<Character> stack=new Stack<>();for(int i=0;i<s.length();i++){char ch1=s.charAt(i);if(ch1=='(' || ch1=='[' || ch1=='{'){stack.push(ch1);}else{if(stack.empty()){return false;//没有与右括号对应的元素}char ch2=stack.peek();if(ch2=='('&&ch1==')' ||ch2=='['&&ch1==']' || ch2=='{'&&ch1=='}'){stack.pop();}else{return false;}}}//遍历完数组后,若栈不为空,即匹配失败if(!stack.empty()){return false;}return true;}

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

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

相关文章

JAVA基础(JAVA SE)学习笔记(二)变量与运算符

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 正文 第一阶段&#xff1a;Java基本语法 1. Java 语言概述 JAVA基础&#xff08;JAVA SE&#xff09;学习…

黑豹程序员-架构师学习路线图-百科:Maven

文章目录 1、什么是maven官网下载地址 2、发展历史3、Maven的伟大发明 1、什么是maven Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and…

ROS opencv 人脸识别

人脸识别需要在输入的图像中确定人脸&#xff08;如果存在&#xff09;的位置、大小和姿态&#xff0c;往往用于生物特征识别、视频监听、人机交互等应用中。2001年&#xff0c;Viola和Jones提出了基于Haar特征的级联分类器对象检测算法&#xff0c;并在2002年由Lienhart和Mayd…

使用 MRVA CodeQL 对开源项目进行大规模漏洞挖掘

1.什么是 MRVA? CodeQL相关的资料目前已经非常多了&#xff0c;但是大部分都集中在介绍ql语法以及基本使用上&#xff0c;更多关注的是对单个项目进行分析。那么如何批量进行漏洞挖掘呢&#xff1f;这里介绍下MRVA。 MRVA是multi-repository variant analysis 的缩写。其实是…

华为云云耀云服务器L实例评测|windows系统3389防爆破之安全加固教程

为什么要选择华为云云耀云服务器L实例&#xff1a; 华为云在全国范围内建立了多个数据中心&#xff0c;这些数据中心之间相互冗余&#xff0c;以确保高可靠性和可用性&#xff0c;用户可以选择最适合的区域来部署应用程序&#xff0c;以实现更好的性能和延迟。 相对于传统的物…

JavaSE入门---认识运算符

文章目录 算术运算符关系运算符逻辑运算符位运算符移位运算符条件运算符运算符的优先级 计算机的最基本的用途之一就是执行数学运算&#xff0c;运算过程中就会用到运算符&#xff0c;那什么是运算符呢&#xff1f; 即&#xff1a;对操作数进行操作的符号&#xff0c;不同运算符…

DevicData-D-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复

引言&#xff1a; 网络犯罪分子采用越来越复杂和具有破坏性的方式威胁着我们的数字安全。本文将深入介绍DevicData-D-XXXXXXXX勒索病毒的特点&#xff0c;提供关于如何应对被其加密的数据文件的恢复方法&#xff0c;并分享一些预防措施&#xff0c;以帮助您保护自己免受这一数字…

人工智能时代大模型算法之文心大模型4.0

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

R语言进度条:txtProgressBar功能使用方法

R语言进度条使用攻略 在数据处理、建模或其他计算密集型任务中&#xff0c;我们常常会执行一些可能需要很长时间的操作。 在这些情况下&#xff0c;展示一个进度条可以帮助我们了解当前任务的进度&#xff0c;以及大约还需要多长时间来完成&#xff0c;R语言提供了几种简单且灵…

强大的下载管理器:Progressive Downloader for Mac

Progressive Downloader for Mac是一种强大的下载管理器&#xff0c;它可以帮助用户更快速、更稳定地下载文件。相比于其他下载工具&#xff0c;PD下载管理器具有很多独特的功能和优势&#xff0c;本文将对其进行详细推广。 在数字化时代&#xff0c;下载已成为我们日常工作中必…

PCL 坡度滤波算法地面分割(C++详细过程版)

目录 一、算法原理1、实现流程2、参考文献二、代码实现三、结果展示一、算法原理 1、实现流程 1、格网示意图 2、计算格网行列数 公式中的特殊符号为向上取整,

STM32CUBEMX_DMA串口空闲中断接收+接收发送缓冲区

STM32CUBEMX_DMA串口空闲中断接收接收发送缓冲区 前言&#xff1a; 我了解的串口接收指令的方式有&#xff1a;在这里插入图片描述 1、接收数据中断特定帧尾 2、接收数据中断空闲中断 3、DMA接收空闲中断 我最推荐第三种&#xff0c;尤其是数据量比较大且频繁的时候 串口配置 …