栈和队列学习记录

news2025/4/25 0:11:21

一、栈

1.栈的概念

操作受限的线性表-----栈:栈只允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),另一端则是栈底(Bottom)。这种受限的操作方式使得栈遵循后进先出(LIFO,Last In First Out)的原则,即最后进入栈的元素最先出栈.

压栈:栈的插⼊操作叫做进栈/压栈/⼊栈,⼊数据在栈顶。

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

2.栈的使用

public class Test {
    public static void main(String[] args) {
        Stack<Integer> stack=new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        System.out.println(stack.size());//获取元素个数 4
        System.out.println(stack.pop());//将栈顶元素出栈并返回 4
        System.out.println(stack.peek());//获取栈顶元素 3
        System.out.println(stack.peek());//           3
        System.out.println(stack.isEmpty());//        true
        }
}

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

3.栈的面试题

1.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;
                    }
                  if(!(stack.peek()+" ").equals(ch+" ")){
                        return false;
                    }else{
                        stack.pop();
                    }
                }
            }
            if(!stack.empty()){
                return false;
            }
            return true;
    }
}

根据题意,是要判断字符串中的括号是否相对应,可将字符串拆解,判断该字符是左括号还是右括号,如果是左括号则直接压入stack栈中,如果是右括号,则取出stack栈顶比较是否相同,作比较时要先判断stack是否为空,如果为空则无需比较,直接返回false即可,比较时如果不相同直接返回false即可,相同则接着往下走,直至遍历完字符串,然后判断stack中是否还有元素,如果stack为空,则返回true,不为空返回false

2.150. 逆波兰表达式求值 - 力扣(LeetCode)

逆波兰表示法(Reverse Polish Notation,RPN),也称为后缀表示法,是一种将运算符置于操作数之后的表达式表示方法。中缀表示法转为后缀表示法,就是将运算符往后移动一个运算级。

示例:

中缀表达式:(3 + 4) * 2         逆波兰表达式:3 4 + 2 *
中缀表达式:5 + (6 - 2) * 3    逆波兰表达式:5 6 2 - 3 * +

 public int evalRPN(String[] tokens) {
        Stack<Integer> stack=new Stack<>();
        for (int i = 0; i < tokens.length; i++) {
            if(tokens[i].equals("+")||tokens[i].equals("-")||tokens[i].equals("*")|| tokens[i].equals("/")){
                int x=stack.pop();
                int y=stack.pop();
                switch (tokens[i]){
                    case "*":
                        stack.push( y*x);
                        break;
                    case "/":
                        stack.push(y/x);
                        break;
                    case "+":
                        stack.push(y+x);
                        break;
                    case "-":
                        stack.push(y-x);
                        break;

                }
            }else{
                stack.push(Integer.parseInt(tokens[i]));
            }
        }
        return stack.pop();
    }
    }

将字符串拆开,用for循环遍历每个元素,如果该元素不是运算符就放到栈stack中,如果是运算符则用两个变量接受stack栈顶的元素,然后进行运算,运算后的结果再压入栈中,需要注意的是先取出的栈放在运算表达式的后一个位置,直至遍历完每个元素,返回栈中剩余的一个元素即可,

3.栈的压入、弹出序列_牛客题霸_牛客网

public boolean IsPopOrder (int[] pushV, int[] popV) {
        // write code here
        Stack<Integer> stack=new Stack<>();
        int j=0;
        for(int i=0;i<pushV.length;i++){
                stack.push(pushV[i]);

                 while((!stack.empty())&&stack.peek()==popV[j]){
                    j++;
                    stack.pop();
                }
            }
            return stack.empty();
        }

该题考查的是栈的压入弹出顺序是否合法,我们可以通过一个for循环来遍历pushV,在每一层for循环当中,先将所遍历的该元素放到栈中,然后用while循环来判断stack栈顶元素和popV[j]元素的值是否相同,如果相同则将栈顶元素弹出,j++,一直循环即可,但在while循环条件中要有一个stack不为null的前提,否则会出现空指针异常。

二、队列

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

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

相关文章

React SSR + Redux 导致的 Hydration 报错踩坑记录与修复方案

一条“Hydration failed”的错误&#xff0c;让我损失了半天时间 背景 我在用 Next.js App Router Redux 开发一个任务管理应用&#xff0c;一切顺利&#xff0c;直到打开了 SSR&#xff08;服务端渲染&#xff09;&#xff0c;突然看到这个令人头皮发麻的报错&#xff1a; …

轻量级景好鼠标录制器

景好鼠标录制器&#xff08;详情请戳 官网&#xff09;是一款免费无广的键鼠动作录制/循环回放工具&#xff0c;轻松自动化应对一些重复繁琐的操作任务&#xff0c;如来回切换窗口、文档同一相对位置的复制粘贴等场景&#xff0c;兼容Win XP - 11 。毕竟此款本身主打简约类型&a…

leetcode--两数之和 三数之和

1.两数之和 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < index1 < index2 …

FFMPEG-视频解码-支持rtsp|rtmp|音视频文件(低延迟)

本人亲测解码显示对比延迟达到7到20毫秒之间浮动兼容播放音视频文件、拉流RTSP、RTMP等网络流 基于 Qt 和 FFmpeg 的视频解码播放器类,继承自 QThread,实现了视频流的解码、播放控制、帧同步和错误恢复等功能 工作流程初始化阶段: 用户设置URL和显示尺寸 调用play()启动线程解…

openEuler安装nvidia驱动【详细版】

注意&#xff1a;在 openEuler 24.03 LTS 系统中安装 NVIDIA 驱动&#xff08;RTX 3090&#xff09;需要禁用默认的 Nouveau 驱动并手动安装官方驱动。 一、准备工作 系统更新与依赖安装 更新系统并安装必要依赖包&#xff1a;sudo dnf update -y sudo dnf install gcc make k…

基于Python爬虫的豆瓣电影信息爬取(可以根据选择电影编号得到需要的电影信息)

# 豆瓣电影信息爬虫(展示效果如下图所示:) 这是一个功能强大的豆瓣电影信息爬虫程序,可以获取豆瓣电影 Top 250 的详细信息。 ## 功能特点 - 自动爬取豆瓣电影 Top 250 的所有电影信息 - 支持分页获取,每页 25 部电影,共 10 页 - 获取每部电影的详细信息,包括: - 标题…

基于PaddleOCR对图片中的excel进行识别并转换成word优化(二)

0、原图 一、优化地方 计算行的时候&#xff0c;采用概率分布去统计差值概率比较大的即为所要的值。 def find_common_difference(array):"""判断数组中每个元素的差值是否相等&#xff0c;并返回该差值:param array: 二维数组&#xff0c;其中每个元素是一个…

Nvidia显卡架构演进

1 简介 显示卡&#xff08;英语&#xff1a;Display Card&#xff09;简称显卡&#xff0c;也称图形卡&#xff08;Graphics Card&#xff09;&#xff0c;是个人电脑上以图形处理器&#xff08;GPU&#xff09;为核心的扩展卡&#xff0c;用途是提供中央处理器以外的微处理器帮…

STM32F407使用ESP8266实现阿里云OTA(上)

文章目录 前言一、阿里云OTA二、命令调试1.升级包上传2.OTA订阅和上报的主题3.命令调试4.具体效果三、所用到的工具和材料前言 在经过前面对ESP8266、SD卡、FLASH的了解之后,终于要进入我们的正题了,就是使用STM32和ESP8266实现阿里云的OTA。这一功能并不复杂,只是需要主要…

测试基础笔记第九天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、数据类型和约束1.数据类型2.约束3.主键4.不为空5.唯一6.默认值 二、数据库操作1.创建数据库2.使用数据库3.修改数据库4.删除数据库和查看所有数据库5.重点&…

Python爬虫与代理IP:高效抓取数据的实战指南

目录 一、基础概念解析 1.1 爬虫的工作原理 1.2 代理IP的作用 二、环境搭建与工具选择 2.1 Python库准备 2.2 代理IP选择技巧 三、实战步骤分解 3.1 基础版&#xff1a;单线程免费代理 3.2 进阶版&#xff1a;多线程付费代理池 3.3 终极版&#xff1a;Scrapy框架自动…

Unity 将Excel表格中的数据导入到Mysql数据表中

1.Mysql数据表users如下&#xff1a; 2.即将导入的Excel表格如下&#xff1a; 3.代码如下&#xff1a; using System; using System.Data; using System.IO; using Excel; using MySql.Data.MySqlClient; using UnityEngine; using UnityEditor;public class ImportExcel {// …

JavsScript 原型链

解决构造函数浪费内存的问题 每一个构造函数都有一个属性prototype属性&#xff0c;指向一个原型对象 原型是构造函数的一个属性 prototype 给数组类型扩展 正常代码&#xff1a; prototype中的this指向为调用对象 所以 基本关系&#xff1a;构造函数产生两个部分&…

消息中间件RabbitMQ02:账号的注册、点对点推送信息

一、默认用户登录和账号注册 1.登录 安装好了RMQ之后&#xff0c;我们可以访问如下地址&#xff1a; RabbitMQ Management 输入默认的管理员密码&#xff0c;4.1.0的管理员账号和密码是&#xff1a; guest guest 2.添加账号 consumer consumer 添加成功后&#xff1a; 角色…

大语言模型的评估指标

目录 一、混淆矩阵 1. 混淆矩阵的结构&#xff08;二分类为例&#xff09; 2.从混淆矩阵衍生的核心指标 3.多分类任务的扩展 4. 混淆矩阵的实战应用 二、分类任务核心指标 1. Accuracy&#xff08;准确率&#xff09; 2. Precision&#xff08;精确率&#xff09; 3. …

好用————python 库 下载 ,整合在一个小程序 UIUIUI

上图~ import os import time import threading import requests import subprocess import importlib import tkinter as tk from tkinter import ttk, messagebox, scrolledtext from concurrent.futures import ThreadPoolExecutor, as_completed from urllib.parse im…

OpenVINO教程(五):实现YOLOv11+OpenVINO实时视频目标检测

目录 实现讲解效果展示完整代码 本文作为上篇博客的延续&#xff0c;在之前实现了图片推理的基础上&#xff0c;进一步介绍如何进行视频推理。 实现讲解 首先&#xff0c;我们需要对之前的 predict_and_show_image 函数进行拆分&#xff0c;将图像显示与推理器&#xff08;pre…

CentOS的安装以及网络配置

CentOS的下载 在学习docker之前&#xff0c;我们需要知道的就是docker是运行在Linux内核之上的&#xff0c;所以我们需要Linux环境的操作系统&#xff0c;当然了你也可以选择安装ubuntu等操作系统&#xff0c;如果你不想在本机安装的话还可以考虑买阿里或者华为的云服务器&…

「Java EE开发指南」用MyEclipse开发EJB 3无状态会话Bean(二)

本教程介绍在MyEclipse中开发EJB 3无状态会话bean&#xff0c;由于JPA实体和EJB 3实体非常相似&#xff0c;因此本教程不涉及EJB 3实体Bean的开发。在本教程中&#xff0c;您将学习如何&#xff1a; 创建EJB 3项目创建无状态会话bean部署并测试bean 在上文中&#xff08;点击…

深度学习在DOM解析中的应用:自动识别页面关键内容区块

摘要 本文介绍了如何在爬取东方财富吧&#xff08;https://www.eastmoney.com&#xff09;财经新闻时&#xff0c;利用深度学习模型对 DOM 树中的内容区块进行自动识别和过滤&#xff0c;并将新闻标题、时间、正文等关键信息分类存储。文章聚焦爬虫整体性能瓶颈&#xff0c;通…