首页 > 编程语言 >算法练习-day10

算法练习-day10

时间:2023-06-18 17:01:17浏览次数:46  
标签:tmp arr int top 练习 栈顶 括号 算法 day10

栈和队列

20. 有效的括号

题意:给定一个只包括 '(',')','{','}','[',']' 的字符串s,判断字符串是否有效。有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号

示例:

算法练习-day10_栈和队列

       思路:本题我有两种思路,1.双栈存储:我们可以使用两个栈分别存储括号的左边和右边,然后在存储右边后,对双栈栈顶进行判断,若括号匹配,则去除左右两边栈顶元素,最后返回双栈的判空情况;2.单栈存储:创建一个栈,用于存储括号的左半部分,然后在遇到右括号时进行判断,若与栈顶元素匹配,则去除栈顶元素,继续判断,若不匹配,则直接返回false

方法1代码:

    bool isValid(string s) {
        stack<char> arr;
        stack<char> tmp;
        arr.push('0');
        tmp.push('0');
        for (int i = 0; i < s.size(); i++)
        {
            if (s[i] == '{' || s[i] == '[' || s[i] == '(')
            {
                arr.push(s[i]);
            }
            else
            {
                tmp.push(s[i]);
                if ((arr.top() == '('&&tmp.top() == ')') || (arr.top() == '{'&&tmp.top() == '}') || (arr.top() == '['&&tmp.top() == ']'))
                {
                    arr.pop();
                    tmp.pop();
                }
            }
        }
        return arr.top() == '0' && tmp.top() == '0';
    }

方法2代码:

    bool isValid(string s) {
        if (s.size() % 2 != 0)
        {
            return false;
        }
        stack<char> arr;
        for (int i = 0; i<s.size(); i++)
        {
            if (arr.empty() && (s[i] == '}' || s[i] == ']' || s[i] == ')'))
            {
                return false;
            }
            if (s[i] == '{' || s[i] == '[' || s[i] == '(')
            {
                arr.push(s[i]);
            }
            else if (s[i] == ')')
            {
                if (arr.top() == '(')
                {
                    arr.pop();
                    continue;
                }
                return false;
            }
            else if (s[i] == '}')
            {
                if (arr.top() == '{')
                {
                    arr.pop();
                    continue;
                }
                return false;
            }
            else
            {
                if (arr.top() == '[')
                {
                    arr.pop();
                    continue;
                }
                return false;
            }
        }
        return arr.empty();
    }

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

题意:给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例:

算法练习-day10_栈和队列_02

       思路:本题我们使用栈的结构特点进行题解,首先我们需要创建一个含底的栈,然后遍历字符串s,当s[i]与栈顶元素相等时,就说明有相邻重复元素,删除栈顶元素,继续向后遍历,当遇到不相等的元素时,加入栈即可;最后我们再将栈中有效元素取出并整体反转,即可得到最终答案

    string removeDuplicates(string s) {
        stack<char> arr;
        for (int i = 0; i<s.size(); i++)
        {
            if(!arr.empty()&&arr.top()==s[i])
                arr.pop();
            else
                arr.push(s[i]);
        }
        s.clear();
        while(!arr.empty())//当顶部为0时说明到底了
        {
            s+=arr.top();
            arr.pop();
        }
        reverse(s.begin(),s.end());
        return s;
    }

150. 逆波兰表达式求值

题意:给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。

注意

  1. 有效的算符为 '+'、'-'、'*' 和 '/' 。
  2. 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  3. 两个整数之间的除法总是 向零截断 。
  4. 表达式中不含除零运算。
  5. 输入是一个根据逆波兰表示法表示的算术表达式。
  6. 答案及所有中间计算结果可以用 32 位 整数表示。

示例:

算法练习-day10_栈和队列_03

      思路:我们使用栈结构特点进行题解,首先建立栈s,用于存储数字,使用stoi对string转换为int类型;当遇到运算符时,取出最上层两个元素进行运算,然后在放回栈顶端,准备下次运算即可,最后输出栈顶元素就是结果

    int evalRPN(vector<string>& tokens) {
        stack<int> s;
        for (int i = 0; i<tokens.size(); i++)
        {
            if (tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/")//为数字时入栈
            {
                s.push(stoi(tokens[i]));
                continue;
            }
            int right = s.top();//右操作数,主要是规范减法和除法
            s.pop();
            int left = s.top();//左操作数
            s.pop();
            if (tokens[i] == "+")
                s.push(left + right);
            else if (tokens[i] == "-")
                s.push(left - right);
            else if (tokens[i] == "*")
                s.push(left*right);
            else
                s.push(left / right);
        }
        return s.top();
    }

标签:tmp,arr,int,top,练习,栈顶,括号,算法,day10
From: https://blog.51cto.com/u_15209404/6508945

相关文章

  • 算法题总结-吃苹果(有序处理)
    原题https://leetcode.cn/problems/maximum-number-of-eaten-apples/有一棵特殊的苹果树,一连n天,每天都可以长出若干个苹果。在第i天,树上会长出apples[i]个苹果,这些苹果将会在days[i]天后(也就是说,第i+days[i]天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的......
  • TensorFlow05.3 神经网络反向传播算法-多层感知机梯度(理论知识)
    首先这个是链式法则:如果扩展到多层感知机的话:我们在学这个的时候首先知道一个东西:所以这个整体的步骤就是:1.2.3.......
  • 代码随想录算法训练营第十天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
    20.有效的括号  特点:左括号之后,可能还会有左括号,但是只要有右括号,那么它必须立刻和最近的左括号代码:1charreturnRightChar(char&c)2{3switch(c)4{5case'[':return']';6case'(':return')';7case'{':r......
  • TensorFlow05.3 神经网络反向传播算法-链式法则
    1BasicRule2Productrule3QuotientRule4Chainrule(链式法则)在这个神经网络中:......
  • TensorFlow05.2 神经网络反向传播算法-单输出感知机和多输出感知机及其梯度
    1单输出感知机在这里我们可以看到,\(W_2,1^1\)其中他的下标第一个2,表示的连着上一层的x2,下标第一个1代表着连着下一侧的x1。然后上标1代表着第一层。E是做了一个loss处理。\(X_i^1\)这个下标的i代表当前层数节点的编号,然后这个1代表着第1层。\(W_i,j^k\),i表示上一层的节点编......
  • 算法刷题记录:AcWing 4908. 饥饿的牛
    目录题目链接:题目分析:时间复杂度SF代码AC代码:题目链接:https://www.acwing.com/problem/content/description/4911/题目分析:数据范围最大\(10^{14}\),所以如果采用枚举一定会TLE,因为只有\(10^5\)天会运来新的草,所以我们可以只考虑运草的天。假设当前到\(d_2\)天之前剩余干......
  • MFC练习2:使用Picture Control控件显示图片
    该方式优点是可以显示JPG等其它格式的图片。一、实验步骤1、使用MFC应用程序向导添加基于对话框的项目;2、在资源视图中拖控件设计UI界面,包含PictureControl和Button共2个控件;3、修改PictureControl控件的Type为Bitmap;4、双击Button按钮编写如下代码voidCpicTestDlg::......
  • 【技术积累】算法中的排序算法【一】
    冒泡排序(BubbleSort)算法描述:通过不断地交换相邻两个元素,把最大的元素移到数组的最后面,然后不断缩小排序范围,直到整个数组有序。算法步骤:遍历整个待排序的数组。比较相邻的两个元素。如果前面的元素比后面的元素大,就交换它们重复以上步骤,直到整个数组有序。伪代码:proced......
  • 算法设计
    公司计划面试2N人。第i人飞往A市的费用为costs[i][0],飞往B市的费用为costs[i][1]。返回将每个人都飞到某座城市的最低费用,要求每个城市都有N人抵达。示例:输入:[[10,20],[30,200],[400,50],[30,20]](第i个人飞往两个城市的费用)输出:110假设你是黄牛,用贪心算法找到月饼的最......
  • 万能欧几里得算法
    问题有一条直线\(y=\frac{Px+K}{Q}\),其中\(P\ge0\)且\(0\leK<Q\)。有两种操作\(U,R\),从左到右扫描这条直线在\((0,L]\)中的部分,若直线跨越了\(y=k(k\in\mathbb{Z})\)这条直线,则执行\(U\)操作;若直线跨越了\(x=k(k\in\mathbb{Z})\)这条直线,则执行\(R\)操作。若......