判斷括號是否有效(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下上的版本中才可以運行。

好了以上就是這次分享的全部內容了,如有錯誤還望斧正,我們下次見。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM