0
点赞
收藏
分享

微信扫一扫

算法练习-day10

zmhc 2023-06-18 阅读 55

栈和队列

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();
    }

举报

相关推荐

Day10

day10

(Day10)String方法

Java Web day10

day10 - 函数基础

自学Java day10

Java学习Day10

0 条评论