zoukankan      html  css  js  c++  java
  • 判断括号是否有效(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下上的版本中才可以运行。

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

  • 相关阅读:
    JS 正则查找与替换
    MySQL 批量插入值
    Python/Django 批量下载Excel
    Python/Django 下载Excel2007
    Python/Django 下载Excel2003
    Python3安装Scrapy
    服务器响应状态码
    细说同域-同父域-跨域
    细说Ajax跨域
    PostgreSQL学习
  • 原文地址:https://www.cnblogs.com/maoqifansBlog/p/12498130.html
Copyright © 2011-2022 走看看