自己寫的一個(gè)單棧括號(hào)匹配,支持干擾字符
#include?<iostream> #include?"Stack.h" using?std::string; using?std::cout; using?std::endl; /** ?*?檢測(cè)字符串中的括號(hào)是否匹配 ?*?@param?str?待檢測(cè)匹配的字符串 ?*?@param?tps1?匹配的符號(hào) ?*?@param?tps2?與tps1相匹配且順序一致的符號(hào) ?*?@return?括號(hào)是否匹配的布爾值 ?*/ bool?isPaired(string?str,?string?tps1,?string?tps2); int?main()?{ ????string?s?=?"int?main(){func(){while(true){cout?<<?endl}}}";????//待檢測(cè)字符串 ????string?msg; ????msg?=?isPaired(s,?"({[",?")}]")???"OK"?:?"No"; ????cout?<<?msg?<<?endl; ????return?0; } bool?isPaired(string?str,?string?tps1,?string?tps2)?{ ????Stack<char>?stack(str.length()?/?2);??//如果字符串中的括號(hào)匹配,最差情況下棧需要的長(zhǎng)度等于字符串長(zhǎng)度的一半 ????int?tps_pos; ????char?tmp; ????for?(char?i?:?str)?{ ????????if?(tps1.find(i)?!=?-1)?{???//棧存儲(chǔ)字符串中的左括號(hào) ????????????if?(stack.isFull()) ????????????????return?false; ????????????stack.push(i); ????????}?else?if?((tps_pos?=?tps2.find(i))?!=?-1)?{ ????????????if?(stack.isEmpty()) ????????????????return?false; ????????????stack.pop(tmp); ????????????if?(tps1[tps_pos]?!=?tmp)?{????//判斷字符串的某一右括號(hào)字符對(duì)應(yīng)匹配的左括號(hào)是否與當(dāng)前pop出的元素是否一致 ????????????????return?false; ????????????} ????????} ????} ????return?stack.isEmpty();?//判斷是否棧空,如果棧為空則說明匹配完畢,如果未空則說明有括號(hào)未匹配 }
好吧,這不是一個(gè)提問。只是一個(gè)代碼片段分享,評(píng)論區(qū)不支持語法高亮就發(fā)問答區(qū)了。
2016-12-25
2016-10-13
#include?<iostream>
#include?"Stack.h"
?
using?std::string;
using?std::cout;
using?std::endl;
?
/**
?*?檢測(cè)字符串中的括號(hào)是否匹配
?*?@param?str?待檢測(cè)匹配的字符串
?*?@param?tps1?匹配的符號(hào)
?*?@param?tps2?與tps1相匹配且順序一致的符號(hào)
?*?@return?括號(hào)是否匹配的布爾值
?*/
bool?isPaired(string?str,?string?tps1,?string?tps2);
?
int?main()?{
????string?s?=?"int?main(){func(){while(true){cout?<<?endl}}}";????//待檢測(cè)字符串
????string?msg;
????msg?=?isPaired(s,?"({[",?")}]")???"OK"?:?"No";
????cout?<<?msg?<<?endl;
????return?0;
}
?
bool?isPaired(string?str,?string?tps1,?string?tps2)?{
????Stack<char>?stack(str.length()?/?2);??//如果字符串中的括號(hào)匹配,最差情況下棧需要的長(zhǎng)度等于字符串長(zhǎng)度的一半
????int?tps_pos;
????char?tmp;
????for?(char?i?:?str)?{
????????if?(tps1.find(i)?!=?-1)?{???//棧存儲(chǔ)字符串中的左括號(hào)
????????????if?(stack.isFull())
????????????????return?false;
????????????stack.push(i);
????????}?else?if?((tps_pos?=?tps2.find(i))?!=?-1)?{
????????????if?(stack.isEmpty())
????????????????return?false;
????????????stack.pop(tmp);
????????????if?(tps1[tps_pos]?!=?tmp)?{????//判斷字符串的某一右括號(hào)字符對(duì)應(yīng)匹配的左括號(hào)是否與當(dāng)前pop出的元素是否一致
????????????????return?false;
????????????}
????????}
????}
????return?stack.isEmpty();?//判斷是否???,如果棧為空則說明匹配完畢,如果未空則說明有括號(hào)未匹配
}