【数据结构】栈

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

栈-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;}
  1. 逆波兰表达式求值
    给你一个字符串数组 tokens ,表示一个根据逆波兰表示法表示的算术表达式。
    请你计算该表达式。返回一个表示表达式值的整数。

逆波兰表示法,是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。

解题思路:
在这里插入图片描述

代码实现:

public int evalRPN(String[] tokens) {Stack<Integer> stack=new Stack<>();for(String s:tokens){if(!isOperation(s)){stack.push(Integer.parseInt(s));}else{//注意计算顺序与出栈顺序int num2=stack.pop();int num1=stack.pop();switch (s){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();}//判断是否运算符public boolean isOperation(String s){if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")){return true;}return false;}

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

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

相关文章

项目管理之分析项目特点的方法

在管理项目时&#xff0c;了解项目的目标和实现方法可以帮助我们更好地规划和执行项目。根据项目的目标和实现方法的不同&#xff0c;可以将项目分为四种类型&#xff1a;地、水、火和气。 对于工程项目&#xff0c;采用基于活动任务的计划管理方法&#xff0c;使用活动网络图…

docker报错问题解决:Error Invalid or corrupt jarfile app.jar

文章目录 1.问题描述2.问题分析3.问题解决 1.问题描述 此时处在 /home/ubuntu/app 目录下&#xff0c;并且在该目录下有一个 jenkins-0.0.1-SNAPSHOT.jar。 我在 /home/ubuntu/app 目录下执行了 docker 容器运行命令&#xff1a; # 映射 8859 端口 # 容器名为 jenkins-demo #…

李宏毅机器学习笔记-半监督学习

半监督学习&#xff0c;一般应用于少量带标签的数据&#xff08;数量R&#xff09;和大量未带标签数据的场景&#xff08;数量U&#xff09;&#xff0c;一般来说&#xff0c;U>>R。 半监督学习一般可以分为2种情况&#xff0c;一种是transductive learning&#xff0c;…

【C++中cin、cin.get()、cin.getline()、getline() 的区别】

文章目录 引入cin基本用法输入多个变量换行符存放在缓冲区中 cin.get()基本用法重载函数换行符残留在缓冲区中 cin.getline()基本使用重载函数换行符不会残留在缓冲区中 string 流中的 getline()总结用法总结几个输入实例输入格式输入格式输入格式输入格式 输出格式 写在最后 引…

【Linux】userdel 命令使用

userdel命令用于删除用户帐号。 语法 userdel [选项] [用户帐号] 命令选项及作用 执行令 userdel--help 执行命令结果 参数 -f, --force 强制删除用户账号 -h, --help 显示此帮助信息并推出 -r, --remove 删除主目录和邮件池 -R, -…

【Qt控件之微调框、进度条】QSpinBox、QDoubleSpinBox、QDial、QProgressBar介绍及使用

概述 QSpinBox类提供了一个微调框小部件。 QSpinBox适用于处理整数和离散的值集&#xff08;例如&#xff0c;月份名称&#xff09;&#xff1b;对于浮点数值&#xff0c;请使用QDoubleSpinBox。 QSpinBox允许用户通过点击上下按钮或按键盘上的上下箭头来增加/减少当前显示的值…

《算法通关村第二关——终于学会链表反转了》

《算法通关村第二关——终于学会链表反转了》 今天学习链表反转 为什么反转这么重要呢&#xff1f;因为反转链表涉及结点的增加、删除等多种操作&#xff0c;能非常有效考察思维能力和代码驾驭能力。另外很多题目也都要用它来做基础&#xff0c; 例如指定区间反转、链表K个一…

网工内推 | IT主管、高级网工,上市公司,必须持有HCIE认证

01 深圳市飞荣达科技股份有限公司 招聘岗位&#xff1a;高级网络工程师 职责描述&#xff1a; 1. 参与、负责集团公司IT基础技术架构的规划设计、实施及维护、性能优化&#xff0c;包括数据中心机房、网络架构、虚拟化平台、信息安全设备及灾备系统等&#xff1b; 2. 负责集团…

Kubernetes技术与架构-服务

从软件系统架构设计分层的角度看&#xff0c;Kubernetes的Service是基于Pod的上层&#xff0c;业务应用部署在Pod中&#xff0c;使用Service绑定Pod部署的应用&#xff0c;Service可以对外或者对上层提供服务&#xff0c;当Pod集群在系统调度的过程中发生弹性伸缩的时候&#x…

基于模型预测人工势场的船舶运动规划方法,考虑复杂遭遇场景下的COLREG(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

openGauss学习笔记-103 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书生成

文章目录 openGauss学习笔记-103 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书生成103.1 操作场景103.2 前提条件103.3 自认证证书生成过程 openGauss学习笔记-103 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书生成 openGauss默认…

【AIGC核心技术剖析】用于 3D 生成的多视图扩散模型

MVDream是一种多视图扩散模型,能够从给定的文本提示生成一致的多视图图像。多视图扩散模型从二维和三维数据中学习,可以实现二维扩散模型的泛化和三维渲染的一致性。我们证明了这样的多视图先验可以作为可推广的 2D 先验,与 3D 表示无关。它可以通过分数蒸馏取样应用于 2D 生…

tcp专题

目录 一.TCP的连接建立 1.1面向连接 1.2TCP报文结构 1.3TCP三次握手 1.4TCP的状态变化 1.5为什么必须是三次握手&#xff0c;而不是两次或者四次 二.TCP的连接断开 2.1TCP的"四次挥手 2.2TCP的状态变化 2.3为什么要有TIME_WAIT状态 2.4为什么TIME_WAIT状态的时…

开发者职场“生存状态”大调研报告分析 - 第四版

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…

《文献阅读》- 遗传算法作为量子近似优化算法的经典优化器(未完成)

文章目录 标题摘要关键词结论研究背景1.介绍 研究内容、成果3. 量子近似优化算法&#xff1a;基本概念及应用 常用基础理论知识2.相关工作酉矩阵 潜在研究点文献链接 标题 Genetic algorithms as classical optimizer for the Quantum Approximate Optimization Algorithm 参…

linux进阶(脚本编程/软件安装/进程进阶/系统相关)

一般市第二种,以bash进程执行 shelle脚本编程 env环境变量 set查看所有变量 read设置变量值 echo用于控制台输出 类似java中的sout declear/typeset声明类型 范例 test用于测试表达式 if/else case while for 函数 脚本示例 软件安装及进阶 fork函数(复制一个进程(开启一个进…

XMLHttpRequest的readyState状态值

readyState状态值 功能&#xff1a;在Ajax请求与服务器响应中&#xff0c;是通过XMLHttpRequest对象完成。而readyState状态值则是记录XMLHttpRequest对象在这个过程进行变化的状态。 readyState状态值readyState分别有5个状态值 0&#xff1a;请求未初始化&#xff1a;在未点击…

Python爬虫基础之Selenium详解

目录 1. Selenium简介2. 为什么使用Selenium&#xff1f;3. Selenium的安装4. Selenium的使用5. Selenium的元素定位6. Selenium的交互7. Chrome handless参考文献 原文地址&#xff1a;https://program-park.top/2023/10/16/reptile_3/ 本文章中所有内容仅供学习交流使用&…

【LeetCode刷题(数据结构与算法)】:合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的 **思路&#xff1a;定义一个头尾指针置为NULL while循环依次比较两个链表的值的大小 遍历链表 比较完数值大小过后连接到tail的尾部 然后各自的链表的节点的next指针指向下一…

数字秒表VHDL实验箱精度毫秒可回看,视频/代码

名称&#xff1a;数字秒表VHDL精度毫秒可回看 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 数字秒表的VHDL设计&#xff0c;可以显示秒和毫秒。可以启动、停止、复位。要求可以存储6组时间&#xff0c;可以回看存储的时间 本资源内含2个工程文件&am…