日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

栈的应用_括号匹配

發(fā)布時(shí)間:2025/4/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈的应用_括号匹配 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目:括號(hào)涉及小括號(hào)(),中括號(hào)[],大括號(hào){},我們要求給定的字符串中時(shí)候括號(hào)是匹配的。[] ([ )]這樣不合法,{}[ ] {( {[ ]} )}是合法的。

解題思路:
核心是最近匹配,使用棧,消去法。如果合法,最后棧為空,因?yàn)閮蓛膳鋵?duì)成功,消除pop().

  • 如果是左邊括號(hào)就進(jìn)棧。
  • 如果是右邊括號(hào):先判斷棧是否為空,然后查看棧頂元素pop()是否是匹配的左邊括號(hào)。如果是,彈出pop().

三種括號(hào)代碼雷同。

核心代碼如下:

switch (brackets[i]){case '(':S.push(brackets[i]);//左括號(hào)入棧break;case ')'://右括號(hào)看棧頂元素是否匹配if (S.empty() || S.top() != '(')//短路表達(dá)式return false;S.pop();break;}

完整運(yùn)行代碼(學(xué)習(xí)時(shí)):

// validator_brackets.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。 #include "pch.h" #include <iostream> #include<stack> #include<string> using namespace std; //括號(hào)匹配 bool validator(const string &brackets) {stack<char> S;for (size_t i = 0; i < brackets.size(); ++i){cout << brackets[i] << " ";switch (brackets[i]){case '(':S.push(brackets[i]);break;case ')':if (S.empty() || S.top() != '(')//距離最近,并且使用短路表達(dá)式return false;S.pop();break;case '[':S.push(brackets[i]);break;case ']':if (S.empty() || S.top() != '[')return false;S.pop();break;case '{':S.push(brackets[i]);break;case '}':if (S.empty() || S.top() != '{')return false;S.pop();break;default: return false;//輸入有誤的情況}}return S.empty();//如果是空(匹配成功),返回真;如果非空,返回false;}int main() {std::cout << "Hello World!\n"; string brackets="(){[()]}";//cin >> brackets;cout << (validator(brackets) ? "括號(hào)成功匹配" : "括號(hào)不匹配或者輸入有誤") << endl;}

學(xué)習(xí):

  • 短路表達(dá)式
    if (S.empty() || S.top() != ‘[’) 如果棧S為空,直接跳過if語句,后面的S.top()!=’['不用看。

  • bool函數(shù)返回值的學(xué)習(xí),結(jié)合棧的特性
    return S.empty();//如果是空(匹配成功),返回真;如果非空,返回false;

  • 條件運(yùn)算符
    cout << (validator(brackets) ? “括號(hào)成功匹配” : “括號(hào)不匹配或者輸入有誤”) << endl;

【注意】
下面的代碼是有缺陷的
區(qū)別在于: if(!S.empty()&&S.top()==’(’)的使用。
這種會(huì)檢測不出來’]'單個(gè)右側(cè)括號(hào)的情況。

class Solution { public:bool isValid(string s) {stack<char> S;if(s.size()==0)return true;else{for(size_t i=0;i<s.size();++i){switch(s[i]){case '(':S.push(s[i]);break;case ')':if(!S.empty()&&S.top()=='(')S.pop();break;case '[':S.push(s[i]);break;case ']':if(!S.empty()&&S.top()=='[')S.pop();break;case '{':S.push(s[i]);break;case '}':if(!S.empty()&&S.top()=='{')S.pop();break;}}return S.empty();}} };

Leetcode上AC代碼(做題時(shí)):

class Solution { public:bool isValid(string s) {stack<char> S;if(s.size()==0)return true;else{for(size_t i=0;i<s.size();++i){switch(s[i]){case '(':S.push(s[i]);break;case ')':if(S.empty()||S.top()!='(')return false;S.pop();break;case '[':S.push(s[i]);break;case ']':if(S.empty()||S.top()!='[')return false;S.pop();break;case '{':S.push(s[i]);break;case '}':if(S.empty()||S.top()!='{')return false;S.pop();break;default: return false;}}return S.empty();}} };

【總結(jié)】
邏輯需要嚴(yán)謹(jǐn),考慮問題需要全面。之前就沒有考慮空串的情況,沒有考慮單個(gè)右側(cè)括號(hào)的處理。

刷題刷少了。

總結(jié)

以上是生活随笔為你收集整理的栈的应用_括号匹配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。