数据结构-栈和队列

目录

栈的概念

栈的使用

​编辑 模拟实现栈

中缀表达式转后缀表达式

括号匹配

出栈入栈次序匹配

队列概念

队列的使用


栈的概念

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作.进行数据插入和删除操作的一端称为栈顶,;另一端称为栈底.栈中的数据元素遵守先进后出的原则.

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

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

栈的底层是一个动态的数组.因此其中的元素在物理和逻辑上都是连续的.

栈的使用

 模拟实现栈

import java.util.Arrays;public class MyStack {public int[] elem;public int usedSize;public static final int DEFAULT_SIZE = 10;public MyStack(){this.elem = new int[DEFAULT_SIZE];}/*** 压栈*/public int push(int val){if (isFull()){elem = Arrays.copyOf(elem,2*elem.length);}this.elem[usedSize] = val;usedSize++;return val;}public boolean isFull(){return usedSize == elem.length;}//出栈public int pop(){if (empty()){throw new MyEmptyStackException("栈为空!");}int ret = elem[usedSize-1];usedSize--;return ret;}public boolean empty(){return usedSize == 0;}public int peek(){if (empty()){throw new MyEmptyStackException("栈为空!");}return elem[usedSize-1];}
}

中缀表达式转后缀表达式

后缀表达式又叫做逆波兰式.

快捷的转换方式:

写代码:将后缀表达式123*+45*6+7*+进行计算,求结果.

这类问题就是利用栈.

思路就是遍历这个表达式,遇到数字就入栈,遇到运算符出栈顶两个元素,第一个元素作为右操作数,第二个元素作为左操作数.

class Solution {

    public int evalRPN(String[] tokens) {

        Stack<Integer> stack = new Stack<>();

        //遍历字符串数组,不是运算符就入栈

        for(String s:tokens){

            if(!isOperations(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 isOperations(String s){

        if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){

            return true;

        }

        return false;

    }

}


括号匹配

思路:遍历字符串,是左括号就压栈,右括号就出栈,看是否匹配.如果字符串遍历完成,此时栈也是空的,就是匹配的.

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;

                }

                char ch2 = stack.peek();

                if(ch2=='['&&ch==']' ||ch2=='{'&&ch=='}' ||ch2=='('&&ch==')'){

                    stack.pop();

                }else{

                    return false;

                }

            }

        }

        if(!stack.empty()){

            return false;

        }

        return true;

    }

}


出栈入栈次序匹配

思路: 用i下标遍历PushV数组,直接入栈;

入栈之后判断j下标元素是不是当前入栈的元素,如果是则出栈,j++,并且弹出栈顶元素,弹出之后判断栈顶元素是不是和j下标元素一样,一样则继续弹出,不一样则i++.

如果不是就继续i++.

循环遍历完之后,栈里还有元素就说明是不匹配的.

public class Solution {

    /**

     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可

     *

     *

     * @param pushV int整型一维数组

     * @param popV int整型一维数组

     * @return bool布尔型

     */

    public boolean IsPopOrder (int[] pushV, int[] popV) {

        Stack<Integer> stack = new Stack<>();

        int j = 0;//遍历popV数组

        for(int i=0;i<pushV.length;i++){

            stack.push(pushV[i]);

            while(!stack.empty()&&stack.peek()==popV[j]){

                stack.pop();

                j++;

            }

        }

        return stack.empty();

    }

}


栈,虚拟机栈和栈帧的区别

栈是一种先进后出的数据结构.

虚拟机栈:是jvm的一块内存空间.

栈帧:是在调用函数的过程当中,在Java虚拟机栈上开辟的一块内存.


队列概念

只允许在一段进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点.入队列:进行插入操作的一段称为队尾.出队列:进行删除操作的一端称为队头.

在Java中,Queue是一个接口,低等是通过链表实现的.

队列的使用

Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口.

add方法也是入队列,它和offer的区别就是add方法在队列容量有限制的情况下如果没有可用空间了,就会抛出异常而offer不会.

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

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

相关文章

【Vue-Router】嵌套路由

footer.vue <template><div><router-view></router-view><hr><h1>我是父路由</h1><div><router-link to"/user">Login</router-link><router-link to"/user/reg" style"margin-left…

动手学DL——MLP多层感知机【深度学习】【PyTorch】

文章目录 4、多层感知机&#xff08; MLP&#xff09;4.1、多层感知机4.1.1、隐层4.1.2、激活函数 σ 4.2、从零实现多层感知机4.3、简单实现多层感知机4.4、模型选择、欠拟合、过拟合4.5、权重衰退4.6、丢失法|暂退法&#xff08;Dropout&#xff09;4.6.1、dropout 函数实现4…

大数据--难点--地图的制作

地图一直是亮点也是难点&#xff0c;刚刚进公司的时候也很难懂~~做出来的也很难看 纯CSS3使用vw和vh视口单位实现h5页面自适应&#xff0c;gulp自动监听sass改动并保存到css中 当修改了sass里面的代码后&#xff0c;gulp会自动监听修改内容并同名保存到css文件夹中&#xff0…

C#字符串占位符替换

using System;namespace myprog {class test{static void Main(string[] args){string str1 string.Format("{0}今年{1}岁&#xff0c;身高{2}cm&#xff0c;月收入{3}元&#xff1b;", "小李", 23, 177, 5000);Console.WriteLine(str1);Console.ReadKey(…

02-C++数据类型-高级

数据类型-高级 4、复合类型 4.4、结构简介 struct inflatable {char name[20];float vol;double price; };inflatable vincent; //C struct inflatable goose; //C例子 // structur.cpp -- a simple structure #include <iostream> struct inflatable // structu…

B057-spring增强 依赖注入 AOP 代理模式 创建Bean

目录 AOP概念代理模式引出AOP实现方式xml方式实现注解方式实现 AOP 概念 事务管理&#xff1a;比如可以抽取try catch的重复代码 日志监控&#xff1a;比如业务逻辑前后打印关于当前订单数量的日志&#xff0c;了解业务做了什么 性能监控&#xff1a;比如业务前后打印时间&…

浪潮信息赵帅:多元算力时代 开源开放的OpenBMC成为服务器管理优先解

“多元算力时代下&#xff0c;大规模的异构服务器设备面临多种处理器架构、多种设备协议、不同管理芯片兼容的系统化设计挑战&#xff0c;管理固件也迎来新的变革。开源开放的OpenBMC&#xff0c;以创新的分层解耦软件架构&#xff0c;兼容不同处理器架构、算力平台和管理芯片&…

人流目标跟踪pyqt界面_v5_deepsort

直接上效果图 代码仓库和视频演示b站视频006期&#xff1a; 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示&#xff1a; YOLOv5 DeepSORT介绍 YOLOv5 DeepSORT是一个结合了YOLOv5和DeepSORT算法的目标检测与多目标跟踪系统。让我为您详细解释一…

【字典学习+稀疏编码Sparse Encoding】简单介绍与sklearn的实现方式

文章目录 1、字典学习与稀疏编码2、sklearn的实现3、示例 1、字典学习与稀疏编码 简单来说&#xff0c;稀疏编码就是把输入向量&#xff08;信号&#xff09;/ 矩阵&#xff08;图像&#xff09;表示为稀疏的系数向量和一组超完备基向量&#xff08;字典&#xff09;的线性组合…

ASP.NET WEB API通过SugarSql连接MySQL数据库

注意&#xff1a;VS2022企业版可以&#xff0c;社区版可能存在问题。实体名称和字段和数据库中的要一致。 1、创建项目&#xff0c;安装SqlSugarCore、Pomelo.EntityFrameworkCore.MySql插件 2、文件结构 2、appsettings.json { “Logging”: { “LogLevel”: { “Default”: …

搭建WebDAV服务手机ES文件浏览器远程访问

文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址6. 使用固定地址测试连接 有时候我们想通过移动设备访问群晖NAS 中的文件,以满足特殊需求,我们在群辉中开启WebDav服务,结合cpolar内网工具生成的公网地址,通过移动客户端ES文件…

docker通用镜像方法,程序更新时不用重新构建镜像

docker通用镜像方法&#xff0c;程序更新时不用重新构建镜像。更新可执行文件后&#xff0c;重新启动容器就可运行。 功能 1、在demo目录下添加脚本文件start.sh&#xff0c;里面执行demo.jar文件。 2、将demo目录映射到镜像下的 /workspace目录。 3、Dockerfile文件中默认…

台湾shopee:虾皮电商平台选品方法与市场机遇

台湾Shopee虾皮电商平台为台湾本土卖家和消费者提供了一个线上交易平台。对于想要在台湾市场做虾皮电商的卖家来说&#xff0c;选择合适的产品是非常重要的。本文介绍一些做虾皮电商的选品方法和策略。 首先&#xff0c;了解市场需求是选品的基础。在进入台湾Shopee市场之前&a…

【Spring专题】Spring之Bean的生命周期源码解析——阶段二(IOC之实例化)

目录 前言阅读准备阅读指引阅读建议 课程内容一、SpringIOC之实例化1.1 简单回顾1.2 概念回顾1.3 核心方法讲解 二、方法讲解2.1 AbstractBeanFactory#getMergedLocalBeanDefinition&#xff1a;合并BeanDefinition2.2 AbstractAutowireCapableBeanFactory#createBean&#xff…

安达发APS|APS排产软件之计划甘特图

在当今全球化和竞争激烈的市场环境下&#xff0c;制造业企业面临着巨大的压力&#xff0c;如何在保证产品质量、降低成本以及满足客户需求的同时&#xff0c;提高生产效率和竞争力成为企业需要迫切解决的问题。在这个背景下&#xff0c;生产计划的制定和执行显得尤为重要。然而…

2023年京东按摩仪行业数据分析(京东销售数据分析)

近年来&#xff0c;小家电行业凭借功能与颜值&#xff0c;取代黑电和白电&#xff0c;成为家电市场的主要增长点。在这一市场背景下&#xff0c;颜值更高、功能更丰富、品种更齐全的各类按摩仪&#xff0c;借助新消费和电子商务的风潮&#xff0c;陆续被推上市场。今年&#xf…

【Cocos Creator 项目实战 】消灭星星加强版(附带完整源码工程)

本文乃Siliphen原创&#xff0c;转载请注明出处 目录 概述 游戏整体流程 游戏框架设计 单一职责的类 主要流程控制类 核心玩法模块 UI&#xff1a; 游戏世界&#xff1a; 本文项目的代码组织结构 作者项目实践总结 场景只有一个入口脚本 尽量少在节点上挂载脚本 构…

从零构建深度学习推理框架-8 卷积算子实现

其实这一次课还蛮好理解的&#xff1a; 首先将kernel展平&#xff1a; for (uint32_t g 0; g < groups; g) {std::vector<arma::fmat> kernel_matrix_arr(kernel_count_group);arma::fmat kernel_matrix_c(1, row_len * input_c_group);for (uint32_t k 0; k < k…

macOS(m芯片)连接服务器及其进行文件传输的各种方式的详解

说明&#xff1a;使用了macOS后发现&#xff0c;win系统能使用的xshell、xftp等连接服务器及其文件传输等软件均不能使用了&#xff0c;没有兼容的版本。所以我们刚切换到mac系统该如何去适应呢。 一、连接远程服务器 macOS中前文也说道我们使用的是iterm2进行终端控制的&…

基于深度信念神经网络的矿石产量预测,基于DBN的矿石产量预测,DBN的详细原理

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) DBN的矿石产量预测 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,是一种非常好的分类算法,本文将DBN算法进行矿石产量预测 DB…