标签:style blog io color os ar for sp div
问题:判断一个文本中,括号是否匹配?
思路:从头到尾扫描字符串,每次遇到左括号(如‘(‘, ‘[‘, ‘{‘)就压入堆栈,如果遇到右括号(如‘)‘, ‘]‘, ‘}‘)就与栈顶元素比较,如果成对,OK,否则判断不匹配。
代码如下:
#include <iostream> #include <stack> #include <set> #include <string> using namespace std; /* * vaild return true, else return false */ bool judge_bracket(const string & str) { stack<char> st; set<char> left; set<char> right; left.insert(‘(‘); left.insert(‘[‘); left.insert(‘{‘); right.insert(‘)‘); right.insert(‘]‘); right.insert(‘}‘); for (int i=0; i!=str.size(); i++) { set<char>::iterator it1 = left.find(str[i]); set<char>::iterator it2 = right.find(str[i]); if (it1 != left.end()) { // match left st.push(str[i]); } else if (it2 != right.end()) { // match right if (st.size() == 0 ) return false; // stack is empty if (str[i] - st.top() <= 2 ) { // 右括号的ASCII码比其成对的左括号大1或2 st.pop(); } else { cout << "str[i]=" << str[i] << "top=" << st.top() <<endl; return false; } } } return true; } int main(int argc, char* argv[]) { string test_buffer[5] = {"]({[", "({[]})","([)]{}","(()[{}])","{[((()))]([])}"}; //test for (int i=0; i<5; i++) { cout << "The string is \"" << test_buffer[i] << "\", The result is " << (judge_bracket(test_buffer[i]) ? "matched" : "not matched" ) << endl; } return 0; }
标签:style blog io color os ar for sp div
原文地址:http://www.cnblogs.com/chenny7/p/4063284.html