首页 > 其他分享 >有效的括号&删除字符串中的所有相邻重复项& 逆波兰表达式求值

有效的括号&删除字符串中的所有相邻重复项& 逆波兰表达式求值

时间:2023-02-21 18:22:59浏览次数:46  
标签:遍历 匹配 括号 字符串 求值 return stack 表达式

一、有效的括号

20. 有效的括号

1.方法概述

  • 使用栈来解决,遍历该字符串,如果是左括号,就将其对应的右括号存进栈,然后和栈顶元素进行匹配,如果匹配为相同的字符,栈顶的元素则弹出,如果不匹配则不满足题意,如果栈都为空了,字符还没匹配完,则说明右括号多了不匹配。否则就是字符串遍历完之后,栈也为空了,说明匹配成功。

2.具体实现

Java实现

点击查看代码
class Solution {
    public boolean isValid(String s) {
        if(s.length() == 0 || s == null) return true;
        if(s.length() % 2 != 0) return false;
        Stack<Character> stack = new Stack<>();
        for(int i = 0;i < s.length();i++){
            char ch = s.charAt(i);
            if(ch == '('){
                stack.push(')');
            }else if(ch == '['){
                stack.push(']');
            }else if(ch == '{'){
                stack.push('}');
            }else if(stack.isEmpty() || stack.peek() != ch){
                return false;
            }else{
                stack.pop();
            }
        }
        return stack.isEmpty();
    }
}

3.要点总结

  • 由于栈结构的特殊性,非常适合做对称匹配类的题目。如果要匹配栈顶元素一定是和遍历完左括号后匹配的。
  • 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false。第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。第四种情况:就是完全匹配的情况了。那么什么时候说明左括号和右括号全都匹配了呢,就是字符串遍历完之后,栈是空的,就说明全都匹配了。分析完之后,代码其实就比较好写了,但还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!

二、删除字符串中的所有相邻重复项

1047. 删除字符串中的所有相邻重复项

1.方法概述

  • 用双端队列来模拟栈,就是存放遍历过的元素,当遍历当前的这个元素的时候,去“栈”里看一下我们是不是遍历过相同数值的相邻元素。然后再去做对应的消除操作。从”栈“中弹出剩余元素,此时是字符串,因为从“栈”里弹出的元素是倒序的,所以再对字符串进行反转一下,就得到了最终的结果。

2.具体实现

Java实现

点击查看代码
class Solution {
    public String removeDuplicates(String s) {
        ArrayDeque<Character> deque = new ArrayDeque<>();
        char ch;
        for(int i = 0;i<s.length();i++){
            ch = s.charAt(i);
            if(deque.isEmpty() || deque.peek() != ch){
                deque.push(ch);
            }else{
                deque.pop();
            }
        }
        String str = "";
        while(!deque.isEmpty()){
            str = deque.pop()+str;
        }
        return str;
    }
}

3.要点总结

  • 该题要求的是字符串顺序,如果str += deque.pop(),则是逆序的,需要注意。

三、 逆波兰表达式求值

150. 逆波兰表达式求值

1.方法概述

  • 当都是数字的时候进栈,当遇到运算符时,弹出栈中的两个元素,第一个弹出的元素放在运算符的右侧,第二个弹出的元素放在运算符的左侧,然后进行运算,运算后继续进栈,栈为空时结束。

2.具体实现

Java实现

点击查看代码
import java.util.*;

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        Integer tmp1,tmp2;
        for(int i = 0;i<tokens.length;i++){
            String str = tokens[i];
            switch(str){
                case "+":
                tmp2 = stack.pop();
                tmp1 = stack.pop();
                stack.push(tmp1+tmp2);
                break;

                case "-":
                tmp2 = stack.pop();
                tmp1 = stack.pop();
                stack.push(tmp1-tmp2);
                break;

                case "*":
                tmp2 = stack.pop();
                tmp1 = stack.pop();
                stack.push(tmp1*tmp2);
                break;

                case "/":
                tmp2 = stack.pop();
                tmp1 = stack.pop();
                stack.push(tmp1/tmp2);
                break;

                default:
                stack.push(Integer.valueOf(str));
            }
        }
        return stack.pop();
    }
}

3.要点总结

  • 逆波兰式(Reverse Polish Notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)。
  • image

标签:遍历,匹配,括号,字符串,求值,return,stack,表达式
From: https://www.cnblogs.com/neverlate/p/17141981.html

相关文章

  • 一文详解SpEL表达式注入漏洞
    摘要:本文介绍了SpEL表达式以及常见的SpEL注入攻击,详细地介绍了部分漏洞攻击实例以及常用的漏洞检测与防御手段。本文分享自华为云社区《​​SpEL表达式注入漏洞分析、检查与......
  • 一文详解SpEL表达式注入漏洞
    摘要:本文介绍了SpEL表达式以及常见的SpEL注入攻击,详细地介绍了部分漏洞攻击实例以及常用的漏洞检测与防御手段。本文分享自华为云社区《SpEL表达式注入漏洞分析、检查与防......
  • 力扣---22. 括号生成
    数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输......
  • Power Automate 常用表达式函数
     表达式函数的参考指南-AzureLogicApps|MicrosoftLearn日期和时间函数若要使用日期和时间,可以使用这些日期和时间函数。有关每个函数的完整参考,请参阅按字......
  • 定时任务 cron表达式
     cron有2种表达形式 6个时间刻度的话 ******  分别对应 秒分时日月星期;7个时间刻度的话 *******  分别对应 秒分时日月星期年;......
  • 多项式的各类计算(多项式的逆/开根/对数/exp/带余除法/多点求值)
    预备知识:FFT/NTT多项式的逆给定一个多项式,请求出一个多项式,满足。系数对取模,首先将多项式的长度拓展至的次幂,然后我们要求的是假设已经求出了又因为有两式相减有因为......
  • elasticsearch之使用正则表达式自定义分词逻辑
    一、PatternAnalyzer简介elasticsearch在索引和搜索之前都需要对输入的文本进行分词,elasticsearch提供的patternanalyzer使得我们可以通过正则表达式的简单方式来定义分......
  • Java的Lambda表达式到底是啥?
    Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。实际上可以想象就是连创造匿名内......
  • 正则表达式中的惰性匹配是什么意思?
    刚学正则表达式的时候,惰性匹配还挺难理解的。所以我看了挺多博客,终于弄懂了,现在用表格整理一下:符号作用.匹配任意除换行符\n外的字符*匹配前面的字符0......
  • Golang基础-正则表达式
    backticksWhenusingbackticks(`)tomakestrings(Rawstringliterals),backslashes(\)don'thaveanyspecialmeaninganddon'tmarkthebeginningofspecial......