栈练习题(逆波兰表达式,有效括号,出入栈次序匹配,最小栈)

news2024/11/25 1:01:58

目录

基础知识:

中缀表达式和后缀表达式(逆波兰式)

中缀表达式转后缀表达式

后缀表达式求结果

有效括号

栈的压入,弹出序列

最小元素栈


基础知识:

栈:是一种先入后出数据结构,它的底层是由数组实现的

入栈:push(),出栈pop(),查看栈顶元素peek()

中缀表达式和后缀表达式(逆波兰式)

中缀表达式:我们日常所使用的加减乘除表达式
后缀表达式:计算器在计算的时候,是把我输入的中缀表达式转化成后缀表达式进行计算的

中缀表达式转后缀表达式

例:中缀表达式: a + b*c +(d*e+f)*g ,转换成后缀表达式

第一步: 从左向右先乘除后加减给中缀表达式加括号

第二步: 把每个运算符都移动到相对应的括号外面(每个运算符都有自己的括号)

后缀表达式求结果

例: 求123* + 45*6 + 7*的结果

解题方法:

遍历表达式,遇到数字就入栈,遇到运算符出栈俩个元素,栈顶元素作为右操作数,,第二个元素作为左操作数,求出运算结果,并把结果入到栈中,以此类推,遍历完表达式

 用代码实现:

力扣剑指Offer 036

https://leetcode.cn/problems/8Zf90G/

代码

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack();
        for(int i = 0;i<tokens.length;i++){
            if(tokens[i].equals("+")){
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(num2+num1);
                continue;
            }
             if(tokens[i].equals("-")){
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(num2-num1);
                continue;
            }
             if(tokens[i].equals("*")){
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(num2*num1);
                continue;
            }
             if(tokens[i].equals("/")){
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(num2/num1);
                continue;
            }
            int ret = Integer.parseInt(tokens[i]);
            stack.push(ret);
        }
        return stack.peek();
    }
}

 思路:就是刚刚上面求后缀表达式的思路

有效括号

力扣: https://leetcode.cn/problems/valid-parentheses/submissions/

 

思路:

创建一个栈,遍历给定字符串,当为左括号就入栈,当为右括号时先看栈是否为空,如果为空返回false,如果不为空,判断这俩个左右括号是否匹配,如果匹配就让这个栈顶元素出栈,依次类推,遍历整个字符串....遍历完成之后,判断栈是否为空,如果不为空(说明左括号多了),返回false,如果为空,则所有的括号都匹配上了返回 true

代码

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack();
        for(int i = 0;i<s.length();i++){
            if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){
                stack.push(s.charAt(i));
            }else{
                if(stack.isEmpty())
                return false;
                char ret = stack.peek();
                if(ret=='('){
                    if(s.charAt(i) == ')'){
                        stack.pop();
                        continue;
                    }else{
                        return false;
                    }
                }
                if(ret=='['){
                    if(s.charAt(i) == ']'){
                        stack.pop();
                        continue;
                    }else{
                        return false;
                    }
                }
                if(ret=='{'){
                    if(s.charAt(i) == '}'){
                        stack.pop();
                        continue;
                    }else{
                        return false;
                    }
                }
            }
        }
        if(stack.isEmpty()){
            return true;
        }
        return false;
    }
}

栈的压入,弹出序列

https://leetcode.cn/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/description/ 

思路:创建一个栈,遍历压入序列初始下标为i,把压入数组一个一个压入到 栈中,判断这个数是否和弹出序列数组(初始下标为j).,是否相等,如果相等就弹出栈顶元素,j++,继续判断新的栈顶元素和新的弹出序列数组[j]是否相等,相等同样弹出栈顶元素,依次类推....遍历结束后判断栈中是否还有元素,如果有说明不可行,返回false,如果栈为空,则返回true

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Stack<Integer> stack = new Stack();
        int j = 0;
        for(int i = 0;i<pushed.length;i++){
            stack.push(pushed[i]);
            while(j<pushed.length && !stack.isEmpty() && stack.peek()==popped[j]){
                stack.pop();
                j++;
            }
        }
        if(stack.isEmpty()){
            return true;
        }
        return false;
    }
}

最小元素栈

设计一个push,pop,peek()操作,并能在常数时间类检索到最小元素的栈

创建俩个栈,一个是普通栈,一个是最小栈

push操作:先把元素入到普通栈,判断最小栈是否为空,如果为空就入栈,然后再判断入栈的元素和最小栈的栈顶元素的大小,如果入栈的元素小于或等于最小栈的栈顶元素,就把这个元素也入到最小栈,此时最小栈里面放的元素一定都是最小值

pop操作,弹出普通栈的栈顶元素,再判断弹出的这个元素是否是最小栈的栈顶元素,如果是就把最小栈的栈顶元素也弹出

top操作,栈顶元素,也就是普通栈的栈顶元素

getMin操作,得到最小值,,,,最小栈的栈顶元素就是最小值

class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> minStack;
    public MinStack() {
        stack = new Stack();
        minStack = new Stack();
    }
    public void push(int val) {
        stack.push(val);
        if(minStack.isEmpty()){
            minStack.push(val);
            return;
        }
        if(val<=minStack.peek()){
             minStack.push(val);
        }
    }
    
    public void pop() {
        if(stack.peek().equals(minStack.peek())){
            minStack.pop();
        }
        stack.pop();
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int getMin() {
        return minStack.peek();
    }
}

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

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

相关文章

docker-compose搭建prometheus+grafana+钉钉告警

前言&#xff1a; 本文将介绍使用docker-compose部署搭建promtheus监控容器、主机、服务等相关状态&#xff1b; 配合granfana面板构建监控大屏&#xff1b; 由于grafana的报警不是很友好&#xff0c;使用dingtalk&#xff0c;配合altermanager&#xff0c;实现钉钉报警。 …

Crosswalk App UI 自动化

目录 前言&#xff1a; Crosswalk WebDriver 实现 Crosswalk app UI 自动化实现 前言&#xff1a; Crosswalk是一个基于Chromium的开源项目&#xff0c;它提供了一个跨平台的应用程序运行时环境&#xff0c;可以帮助开发人员在移动设备上构建高性能的Web应用程序。在Crossw…

“体验家”亮相第六届IAIC成都国际医美产业大会

6月23日-25日&#xff0c;第六届IAIC成都国际医美产业大会暨“医美之都”高峰会议在成都世纪城国际会议中心成功举行。本次大会邀请了来自国家药品监督管理局、部分省市地区的相关领导莅临指导&#xff0c;以及来自全国100医美行业头部平台&#xff0c;近2000位医美产业领军代表…

关于前后端JSON解析差异问题与思考

目录 一、问题回顾 二、问题思考 2.1 JavaScript如何解析json字符串 2.2 Java如何解析json字符串 2.3 Java和JavaScript交互如何出现JSON解析问题 三、经验总结 本文主要总结了作者在一次涉及流程表单的需求发布中遇到的问题及思考总结。 一、问题回顾 在一次涉及流程表…

FPGA驱动SPI屏幕(附完整工程)

一. 简介 相信大家都玩过屏幕&#xff0c;在FPGA上使用最多的就是VGA/HDMI接口的显示器了&#xff0c;这两种显示器的优点就不用说了&#xff0c;缺点就是体积比较大&#xff0c;而且价格比较贵&#xff0c;对于追求便携/价格低的我来说&#xff0c;SPI接口的屏幕才是我的首要…

实战操作接口自动化测试

最近接到一个接口自动化测试的case&#xff0c;并展开了一些调研工作&#xff0c;最后发现&#xff0c;使用pytest测试框架并以数据驱动的方式执行测试用例&#xff0c;可以很好的实现自动化测试。这种方式最大的优点在于后续进行用例维护的时候对已有的测试脚本影响很小。当然…

文件IO_文件截断_ftruncate,truncate(附Linux-5.15.10内核源码分析)

目录 1.为什么需要文件截断&#xff1f; 2.truncate函数介绍 2.1 truncate函数 2.2 truncate函数内核源码分析 2.3 truncate函数使用示例 3.ftruncate函数介绍 3.1 ftruncate函数 3.2 ftruncate函数内核源码分析 3.3 ftruncate函数使用示例 3.4 ftruncate和文件偏移量…

8年测试总结,App自动化测试-Appium常遇问题+解决(详细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 问题1&#xff1a…

小白入门C#编写MVC登录小案例

一、C#编写MVC登录小案例 &#x1f680;1. 新建MVC项目。 &#x1f680;2. 在Models文件夹下创建一个User类&#xff0c;包含登录所需要的用户名和密码属性。 namespace MvcLogin.Models {public class User{public string UserName{get; set;}public string Password{get;se…

基于Java+SpringBoot+Vue+Uniapp前后端分离考试学习一体机设计与实现(视频讲解,已发布上线)

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

计算机基础专升本笔记三 计算机中的数据表示、编码

计算机基础专升本笔记三计算机中的数据表示、编码 一、计算机中的数据的单位 &#xff08;一&#xff09;数据存储的单位有哪些&#xff1f; 计算机存储单位有 bit, Byte, KB, MB, GB, TB, PB, EB, ZB, BB来表示。我们经常将Byte简称为B&#xff0c;将KB简称K。 &#xff08…

微信怎么自动加好友,通过好友后自动打招呼

很多客户朋友每天花大量的时间用手机搜索添加好友&#xff0c;这样的添加很集中也容易频繁&#xff0c;而且效率还低。对方通过后&#xff0c;有时也不能及时和客户搭建链接&#xff0c;导致客户也流失了。 现在可以实现自动添加和自动打招呼哦&#xff0c;只需要导入数据、设置…

linux查看ipynb文件

linux查看ipynb文件 使用jupyter查看 使用jupyter查看 安装 pip install jupyter添加配置好的环境到jupyter notebook的kernel中&#xff1a; python -m ipykernel install --user --name mmdet --display-name "mmdet"运行jupyter notebook &#xff08;在ipynb…

精选了6款好用的AI绘画工具,值得一试

近几年来&#xff0c;伴随着AI技术的发展&#xff0c;设计领域发生了巨大的变化。AI绘图工具的出现很大程度上减轻了设计师的工作负担&#xff0c;本文精选了6款优秀的AI绘图工具为大家推荐&#xff0c;一起来看看吧&#xff01; 1、即时灵感 即时灵感作为国产的AI绘图工具&a…

相机标定学习笔记

Kalibr 是标定工具中&#xff0c;唯一一个可以标定camToImu的&#xff0c;是vio必不可少的工具&#xff0c;其他的都有替代品。所以学习多种开源算法进行相机标定&#xff0c;并记录学习相机标定的过程。 一、相机标定 1、在场景中放置一个已知的物体 &#xff08;1&#xff…

ENSP实验四:搭建VPN(GRE,配置安全策略)

首先分析一下数据的流向&#xff1a; PC1->PC2 1、FW1&#xff1a;trust->dmz 【192.168.1.1->192.168.2.1 ICMP】 2、AR1->AR2&#xff1a;【202.1.1.1->202.1.3.1|GRE|192.168.1.1->192.168.2.1 icmp】 3、FW2&#xff1a; ①untrust->local …

提示工程师:如何写好Prompt

提示工程由来 提示工程是一门相对较新的学科&#xff0c;用于开发和优化提示以有效地将语言模型 (LM) 用于各种应用程序和研究主题。 研究人员使用提示工程来提高 LLM 在广泛的常见和复杂任务&#xff08;例如问题回答和算术推理&#xff09;上的能力。 开发人员使用提示工程…

【图像处理OpenCV(C++版)】——5.6 图像平滑之联合双边滤波

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

用Vue如何实现低代码开发平台?

前言 在众多开发技术中&#xff0c;Vue组件化开发技术以其卓越的灵活性和高效性备受瞩目。 低代码平台相信不少人知道它的存在&#xff0c;而且现在大部分公司都在开发自己的低代码平台&#xff0c;首先我们来看看低代码平台可视化界面&#xff1a; 官网&#xff1a;https://ww…

UTM 4.3 发布:在 macOS 上优雅的使用 QEMU 虚拟化 Windows、Linux 和 macOS

UTM 4.3 发布&#xff1a;在 macOS 上优雅的使用 QEMU 虚拟化 Windows、Linux 和 macOS 在 iOS 中虚拟化 Windows、Linux 和 Unix 请访问原文链接&#xff1a;https://sysin.org/blog/utm-4/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xf…