题目描述:
思路:遍历字符串,遇到左括号入栈,遇到右括号,判断是否匹配,若不匹配,呵呵。若匹配,左括号出栈,继续遍历,最后若没有未得到匹配的左括号和右括号,则视为匹配;
坑爹的地方:
比如你要注意}{也是不匹配的,还有你要小心"[ ]aaa"这种中间/前面带有空格的字符串,不清楚测试用例是否有,但是这只是作为字符串处理类型的题目的一个提醒。
代码+注释:
#include <iostream> #include <string> #include <stdio.h> using namespace std; //cin对象不适合用来读入字符串对象,因为它在遇到第一个空格时就会停止录入,故对字符串处理类型的题目, //要小心字符串中间有空格的情况 //另一个情况就是对于这种括号匹配的题目,如")( }{ ]["应该是不匹配的,所以你想要通过开6个变量来记录 //括号的个数,从而实现判断匹配与否是不可行的!!(如下面的代码) /*int main(){ int i, txcase; string tocheck; cin >> txcase;//这里另一点值得注意的是,在getline前面如果需要使用cin语句,应该在 //cin语句下一句加一个cin.ignore(); cin.ignore(); while(txcase--){ int braket_left = 0; int braket_right = 0; int brace_left = 0; int brace_right = 0; int square_bk_left = 0; int square_bk_right = 0; getline(std::cin,tocheck); for(i = 0;i < tocheck.length();i++){ switch(tocheck[i]){ case '{':brace_left++;break; case '}':brace_right++;break; case '(':braket_left++;break; case ')':braket_right++;break; case '[':square_bk_left++;break; case ']':square_bk_right++;break; } } //debug cout << "for debug"<<endl << tocheck << "debug" << endl; if(brace_left == brace_right && braket_left == braket_right && square_bk_left == square_bk_right) cout << "Yes" << endl; else cout << "No" << endl; } system("pause"); return 0; } */ #include <stack> int main(){ stack<char> storerof_bk; int i, txcase; string tocheck; bool flag;//flag用于记录是否出现下面的for语句的后两个if()语句的情况,默认为不出现 cin >> txcase; cin.ignore(); while(txcase--){ flag = false; getline(std::cin,tocheck); for(i = 0; i < tocheck.length();i++){//遍历字符串 if(tocheck[i] == '(' || tocheck[i] == '[' || tocheck[i] == '{')//遇到左括号就进栈 storerof_bk.push(tocheck[i]); if((tocheck[i] == ')' || tocheck[i] == ']' || tocheck[i] == '}') && !storerof_bk.empty()){ if(tocheck[i]== ')' && storerof_bk.top() == '(')//遇到右括号且栈非空,就开始判断匹配,如果匹配,出栈 storerof_bk.pop(); else if(tocheck[i]== ']' && storerof_bk.top() == '[') storerof_bk.pop(); else if(tocheck[i]== '}' && storerof_bk.top() == '{') storerof_bk.pop(); else{ flag = true; break; } } else if((tocheck[i] == ')' || tocheck[i] == ']' || tocheck[i] == '}') && storerof_bk.empty()){ //也有此时只包含右括号的字符串的情况,这种情况,左括号的栈已经为空,故需要单独判断 flag = true; break; } } //走完循环之后还得判断输出 if(!flag && storerof_bk.empty()) cout << "Yes" << endl; else cout << "No" << endl; //debug //cout << "debug" << endl; while(!storerof_bk.empty()){//最后还要注意清空栈 storerof_bk.pop(); } } system("pause"); return 0; }