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