自己寫的一個單棧括號匹配,支持干擾字符
#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();?//判斷是否??眨绻麠榭談t說明匹配完畢,如果未空則說明有括號未匹配
}好吧,這不是一個提問。只是一個代碼片段分享,評論區不支持語法高亮就發問答區了。
2016-12-25
我也來分享一下,兄弟不會介意吧。和你寫的有點不同,也支持干擾字符! MyStack<char>?*pStack?=?new?MyStack<char>(30); ?int?flag?=?0; ?char?elem; ?char?str[]?=?"[cfg(2sdf*2ds)f]"; ?for?(int?i?=?0;i?<?strlen(str);i++) ?{ ??switch?(str[i]) ??{ ??case?'(': ??case?'[': ???pStack->push(str[i]); ???break; ??case?')':?? ???if?(!pStack->pop(elem)) ???{ ????flag?=?1; ????continue; ???} ???if?(elem?!=?'(') ???{ ????flag?=?1; ???} ???break; ??case?']': ???if?(!pStack->pop(elem)) ???{ ????flag?=?1; ????continue; ???} ???if?(elem?!=?'[') ???{ ????flag?=?1; ???} ???break; ??} ?} ?if?(!pStack->stackEmpty()?||?1?==?flag) ?{ ??cout?<<?"字符串括號不匹配"?<<?endl; ?} ?else ?{ ??cout?<<?"字符串括號匹配"?<<?endl; ?}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();?//判斷是否???,如果棧為空則說明匹配完畢,如果未空則說明有括號未匹配
}