• 判断括号是否有效(c++描述)


    开门见山,假设我们有一大串的由'{', '}', '[', ']', '(', ')' 这些括号构成比如像这样的"{[}][()"符号串,我们肉眼当然能看出它是非法的,那么如何使用代码来判断是否合法呢?

    其实我们可以借助栈来判断这些符号串是否非法 :

    1.首先我们我需要建立符号的一对一映射,如下所示:

    1  map<char, char> mp = {{')', '('}, {'}', '{'}, {']', '['}}; // 映射括号

    2.我们对字符串进行遍历

    1.如果能通过映射的键找到当前字符str[i],我们就从栈顶弹出一个元素并获取该元素。当然,如果是栈为空的清空的话,我们就为这个字符随便赋个值,比如说赋值为 '@',我们假记该变量为top_element。接下来我们看看是否能从当前字符str[i]映射所对应的值与top_element是否相同,若不同,则可以判断该符号串为非法的。

    2.若果找不到该字符str[i]映射的键,则先将其加入栈中。

    3. 循环结束 ,若栈为空则表示当前字符串合法,若不为空,则表示当前字符串非法

    4. 可能光用语言描述不能只管表达,下面我们来看图示,假设我们输入了"()"字符串,其具体过程如下:

    5. 好了看完图,接下来我们C++的代码来描述一下该过程:

    #include <iostream>
    #include <stack>
    #include <string>
    #include <map>
    using namespace std;
    
    class Solution
    {
    public:
        bool isValid(string s)
        {
            if (s == "") // 如果时空字符串也合法
                return true;
            if (s.size() == 1) // 只有一个字符肯定非法
                return false;
            stack<char> st;
            map<char, char> mp = {{')', '('}, {'}', '{'}, {']', '['}}; // 映射括号
            for (int i = 0; i < s.size(); i++)
            {
                if (mp.find(s[i]) != mp.end()) // 查找mp是否映射了该符号
                {
                    char top_ele = (st.size() == 0) ? '#' : st.top(); // 获取栈顶元素,若为空则随便设置一个字符
                    if (top_ele != '#')                               // 栈不为空则弹出元素
                        st.pop();
                    if (top_ele != mp.find(s[i])->second) // 如果这个元素被弹出的元素和mp对应映射的值不一样,则直接返回false
                        return false;
                }
                else
                {
                    st.push(s[i]); //压入栈中
                }
            }
            return st.size() == 0; // 如果栈为空则表示合法
        }
    };

    6. 注意代码中map是直接用list初始化的,所以这段代码必须在c++11下上的版本中才可以运行。

    好了以上就是这次分享的全部内容了,如有错误还望斧正,我们下次见。

  • 相关阅读:
    [LeetCode] Power of Three 判断3的次方数
    [LeetCode] 322. Coin Change 硬币找零
    [LeetCode] 321. Create Maximum Number 创建最大数
    ITK 3.20.1 VS2010 Configuration 配置
    VTK 5.10.1 VS2010 Configuration 配置
    FLTK 1.3.3 MinGW 4.9.1 Configuration 配置
    FLTK 1.1.10 VS2010 Configuration 配置
    Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别
    [LeetCode] Bulb Switcher 灯泡开关
    [LeetCode] Maximum Product of Word Lengths 单词长度的最大积
  • 原文地址:https://www.cnblogs.com/maoqifansBlog/p/12498130.html
Copyright © 2020-2023  润新知