栈和队列-栈的练习题

news2024/10/28 13:30:29

        1. 逆波兰表达式

题目:

给出一个算数式的后缀表达式,我们来求他最后算数值.

在解题之前我们来认识一下中缀表达式,和后缀表达式(逆波兰表达式

我们在写数学遇到的那种形式的算数表达式就是中缀表达式,我们要从中缀表达式变为后缀表达式(逆波兰式),计算机时不知道式子的计算顺序的,因此我们给算数顺序加上括号来提醒计算机来进行计算,然后我们把当前括号内的式子的运算符移到右括号外面比如 ((a + b) * c) ->((a b)+c)*即可

题目解析:

        我们取出字符串的每一个字符,判断是否为算数运算符,不是就说明是数字,我们就进行入栈操作,如果是,我们就取出栈中的俩个元素,第一个元素作为栈的右操作数,第二个元素作为栈的左操作数,然后我们进行计算,算出的结果再入栈,然后继续取出字符串的字符,循环直到遍历完字符串为止,我们就算出了最终值,返回结果即可.

    整体代码:

        注意,我们从字符串取出来的字符如果要进行算数运算,我们就要进行类型的转换,比如我们这一题,把数字字符转换为整数 Integer.parseInt(x);然后我们的不同运算符的运算我们是通过switch-case来进行表述的.

public class Test1 {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        //遍历tokens数组
        for (String x : tokens) {
            //如果是数字就直接放到栈里面
            if(!isOperation(x)) {
                //把数字字符转换为整数
                stack.push(Integer.parseInt(x));
                //如果不是数字
            }else {
                int num2 = stack.pop();//右操作数
                int num1 = stack.pop();//左操作数
                 switch (x) {
                     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();
    }
    //判断x是不是操作符
    private boolean isOperation(String x) {
        if (x.equals("+") || x.equals("-") || x.equals("*") || x.equals("/")) {
            return true;
        }
        return false;
    }
}

2. 有效的括号

题目:

        我们给出一个字符串,里面放着一堆括号,我们设置里面的括号有三种(),{}.[],我们要判断里面的括号是不是成对的,并且能相互匹配上的.

题目解析:

        我们只需要解决三种非正常情况:括号不匹配,左括号多,右括号多.

解题步骤: 1.左括号入栈. 2.遇到右括号和栈顶元素的左括号是否匹配

        

整体代码:

        我们遍历字符串,把每一个字符取出来,然后我们要对字符进行(字符串里面都是那三种括号)判断是不是左括号,如果是左括号就入栈,如果不是左括号,就说明是右括号,我们就进行匹配,取出我们栈里面的元素和当前的字符进行匹配匹配成功就出栈,失败就返回false,此时,我们考虑上面提到的其他俩种情况,当我们的栈空,但是字符串还没遍历完,说明了我们的右括号数目大于左括号数返回false.如果我们的.当我们遍历完字符串之后,我们发现了栈里面还有元素,说明我们的左括号数目大于右括号数返回false.

public class Test2 {
    public boolean isValid(String s) {
        //设定一个栈
        Stack<Character> stack = new Stack<>();
        //1.遍历字符串
        for (int i = 0; i < s.length(); i++) {
            //把字符串每一个字符取出来
            char ch = s.charAt(i);
            //2. 判断是不是左括号
            if(ch == '(' || ch == '{' || ch == '[') {
                //是左括号就入栈
                stack.push(ch);
            }else {
                //不是左括号,那么就是右括号就进行匹配
                if(stack.empty()) {
                    //TODO 如果栈是空的,说明栈空字符串不空,右括号多
                    return false;
                }else {
                    //如果不是空的,就进行匹配
                    char ch1 = stack.peek();//栈里面放的是左括号
                    if((ch1 == '(' && ch == ')') || (ch1 == '[' && ch == ']') || (ch1 == '{' && ch == '}')) {
                        stack.pop();//出栈进行匹配
                    }else {
                        //TODO 如果左右括号不匹配
                        return false;
                    }
                }
            }
        }
        if(!stack.empty()) {
            //TODO 如果遍历完之后,栈还有元素,说明字符串空了,左括号多
            return false;
        }
        return true;


    }
}

3. 栈的压入,弹出序列

         栈的一些特性补充,有些题是这种排出栈顺序的题,我们就要注意一下,如图显示,如果说明能够在入栈的期间出栈,我们就有不同的出栈顺序.

题目:

        我们给一个入栈数组和出栈数组,判断这个入栈顺序和出栈顺序是否匹配.

题目解析:

        解题步骤:

1. 遍历push数组,把元素放到栈中
2. 每push一个元素,就和pop数组的元素比较
3. 如果相等j++ 且出栈
4. 如果不相等想办法入栈

整体代码:

        我们先遍历push数组,让里面的元素入栈,然后我们判断pop数组里面的元素是否和栈顶元素一样,一样我们就把栈顶元素出栈,此时我们需要判断栈是不是空的,我们的j下标是不是在合法范围内.最后我们遍历完了数组,栈为空说明我们的压入顺序能匹配上弹出顺序.

        

//TODO 栈的压入,弹出序列
public class Test3 {
    public boolean IsPopOrder(int[] pushA,int[] popA) {
        //先创建一个栈
        Stack<Integer> stack = new Stack<>();
        int j = 0;
        //遍历pushA数组
        for (int i = 0; i < pushA.length; i++) {
            //每次遍历先push进栈
            stack.push(popA[i]);
            //我们再判断popA的元素和pushA的元素是否一样
            //栈是否为空,j是否在合法下标内,栈的元素是否等于弹出数组的元素
            while (!stack.empty()&& j < popA.length && stack.peek() == popA[j]) {
                //如果相等我们就出栈
                stack.pop();
                j++;
            }
        }
        return stack.empty();
    }
}

4. 最小栈 

题目:

题目解析:

        push方法

        pop方法

其他代码看看整体代码即可

然后我们这里注意一个地方

如果只写minStack.peek() > val,那么当栈里面有多个相同的最小值的时候就会出问题,如图

整体代码:

//TODO 最小栈
public class Test4 {
    class MinStack {
        //定义俩个栈
        private Stack<Integer> minStack;
        private Stack<Integer> stack;

        public MinStack() {
            minStack = new Stack<>();
            stack = new Stack<>();
        }

        public void push(int val) {
            //普通栈一定要放元素
            stack.push(val);
            if(minStack.empty()) {
                //最小栈如果为空也要放元素
                minStack.push(val);
            } else {
                //如果最小栈的元素比val大,那么也要放进去
                if(minStack.peek() >= val) {//这个等号要注意,因为如果多个最小值的话也要放进去,不然最小栈就为空了
                    minStack.push(val);
                }
            }

        }

        public void pop() {
            //普通栈什么情况下都要弹出
            int val = stack.pop();
            if (!minStack.empty()) {//在最小栈不为空的情况下
                if (val == minStack.peek()) {
                    //最小栈只有在和普通栈的val一样才会pop
                    minStack.pop();
                }
            }
        }
        //获取当前普通栈的值
        public int top() {
        return stack.peek();
        }
        //最小栈的peek,每次通过这个方法获取最小值
        public int getMin() {
            if(!minStack.empty()) {
               return minStack.peek();
            }
            return -1;
        }
        //当写代码出错了,记得调试
        //1. 看哪个测试用例错了
        //2. 拿着这个测试用例区画图
        //3. 不能光看代码
    }
}

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

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

相关文章

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25 0. 前言 大语言模型在很多领域都有成功的应用&#xff0c;在本期计算机前沿技术进展研究介绍中&#xff0c;我们将带来一篇用大语言模型进行诺贝尔文学作品分析的论文。虽然有一定趁最近诺贝尔奖热潮的意味&…

现代数字信号处理I-极大似然估计 学习笔记

目录 1. 极大似然估计的模型介绍 2. 极大似然估计可以达到CRLB的说明 2.1 前期准备&#xff1a;符号定义及说明 2.2 中心极限定理 2.3 大数定理 2.4 说明思路 2.5 具体过程 说明&#xff1a;此部分内容在2024版本的课程中没有提供&#xff0c;需要参考2023之前的课程&…

R语言笔记(五):Apply函数

文章目录 一、Apply Family二、apply(): rows or columns of a matrix or data frame三、Applying a custom function四、Applying a custom function "on-the-fly"五、Applying a function that takes extra arguments六、Whats the return argument?七、Optimized…

基于贝叶斯优化的K折交叉验证BP回归模型(可预测未来数据)

基于贝叶斯优化的K折交叉验证BP回归模型(可预测未来数据) 目录 基于贝叶斯优化的K折交叉验证BP回归模型(可预测未来数据)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于贝叶斯优化的K折交叉验证BP回归模型的多输入单一输出回归模型 Matlab版本&#xff1a;2020a及以…

深度学习_循环神经网络_预测平安中国股价(文末附带数据集下载链接, 长期有效, 如果有大佬愿意帮忙, 我先在这磕一个,感谢)

简介: 使用循环神经网络RNN对股价进行预测, 也就是搭建循环神经网络对中国平安的收盘股价进行预测 深度学习训练流程 1.数据集导入 2.数据预处理 3.模型训练 模型结构要求: 单层简单R…

U盘恢复数据,这四款软件你必须知道!

不管是哪个行业哪个职位&#xff0c;数据安全都是很重要的。比如说我认识的财务姐姐&#xff0c;每天处理的财务报表、客户信息、合同文件等&#xff0c;都必须确保万无一失&#xff0c;尤其是各种U盘数据。为了防止数据丢失后找不到数据的情况&#xff0c;今天来和大家分享四款…

智能管线巡检系统:强化巡检质量,确保安全高效运维

线路巡检质量的监控是确保线路安全、稳定运行的重要环节。为了有效监控巡检质量&#xff0c;采用管线巡检系统是一种高效、科学的手段。以下是对如何通过管线巡检系统实现线路巡检质量监控的详细分析&#xff1a; 一、巡检速度监控 管线巡检系统能够实时监控巡检人员的巡检速度…

算力引领 智慧安防| Gooxi助力安防行业智慧化转型

安防行业作为AI最为合适生长的天然场域&#xff0c;早在国内AI市场爆发之前就提前进行了“预演”&#xff0c;诞生了AI四小龙。当AIGC赋能安防技术革新&#xff0c;安防再次与AI浪潮撞了个满怀。在这一次大模型的浪潮中&#xff0c;安防场上的老玩家纷纷抢滩大模型。而今&#…

Word中Normal.dotm样式模板文件

Normal.dotm文档 首先将自己电脑中C:\Users\自己电脑用户名\AppData\Roaming\Microsoft\Templates路径下的Normal.dotm文件做备份&#xff0c;在下载本文中的Normal.dotm文件&#xff0c;进行替换&#xff0c;重新打开word即可使用。 字体样式如下&#xff08;可自行修改&#…

Redis 发布订阅 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 发布订阅 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 发布订阅 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis &a…

git的学习之远程进行操作

1.代码托管GitHub&#xff1a;充当中央服务器仓库的角色 2.git远程进行操作 3.配置本地服务器的公钥 4.推送 5.git远程操作 pull .gitignore 6.给命令配置别名 git config --global alias.st status 7.标签管理 git tag -a [name] -m "XXX" [commit_id] 操作标签…

ICMP Redirect Attack Lab

本实验的网络拓扑图如下所示: Task 1: Launching ICMP Redirect Attack 在Victim主机上查看路由表&#xff0c;结果如下: 2.在Victim上Ping 192.168.60.60.5&#xff0c;结果如下: 3.在Attkaker主机上创建redirect_attack.py文件&#xff0c; 内容如下: 4.接下来查看tracerou…

纯GO语言开发RTSP流媒体服务器-RTSP推流直播、本地保存录像、录像回放、http-flv及hls协议分发

温馨提示&#xff1a;我们分享的文章是给需要的人&#xff0c;不需要的人请绕过&#xff0c;文明浏览&#xff0c;误恶语伤人&#xff01; 前言 在软件开发中遇到使用流媒体音视频的行业比较多&#xff0c;如安防监控系统、无人机巡逻视频上云处理、直播平台、教育与企业培训…

C++红黑树插入操作的模拟实现

1.红黑树概念 1.1什么是红黑树 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出俩…

Linux 重启命令全解析:深入理解与应用指南

Linux 重启命令全解析&#xff1a;深入理解与应用指南 在 Linux 系统中&#xff0c;掌握正确的重启命令是确保系统稳定运行和进行必要维护的关键技能。本文将深入解析 Linux 中常见的重启命令&#xff0c;包括功能、用法、适用场景及注意事项。 一、reboot 命令 功能简介 re…

Flutter图片控件(七)

1、加载图片 import package:flutter/material.dart;void main() {runApp(const MaterialApp(home: MyHomePage(),)); }class MyHomePage extends StatelessWidget {const MyHomePage({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: AppB…

Python:背景知识及环境安装

一、计算机的基础概念 1.1 什么是计算机&#xff1f; 最早我们有计算器&#xff0c;但是他只能完成算数运算的功能 而计算机能完成的工作有&#xff1a; &#xff08;1&#xff09;算术运算 &#xff08;2&#xff09;逻辑判断 &#xff08;3&#xff09;数据存储 &#xff08…

k8s 二进制部署安装(一)

目录 环境准备 初始化操作系统 部署docker 引擎 部署 etcd 集群 准备签发证书环境 部署 Master01 服务器相关组件 apiserver scheduler controller-manager.sh admin etcd 存储了 Kubernetes 集群的所有配置数据和状态信息&#xff0c;包括资源对象、集群配置、元数据…

基于SSM+小程序的旅游社交登录管理系统(旅游4)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 ​ 本旅游社交小程序功能有管理员和用户。管理员有个人中心&#xff0c;用户管理&#xff0c;每日签到管理&#xff0c;景点推荐管理&#xff0c;景点分类管理&#xff0c;防疫查询管理&a…

51单片机完全学习——DS18B20温度传感器

一、DS18B20数据手册解读 首先我们知道DS18B20使用的是单总线传输&#xff0c;默认情况下读出来的温度是12位的&#xff0c;我们这里只讨论外部电源供电这种情况。 有这张图片我们知道&#xff0c;12位温度的最小分辨率是10^-4次方&#xff0c;因此就是0.0625.我们只需要将最后…