/* 本来读完题目以后的第一反应是,看上去挺简单的,直接先注释一下 "//水题" 不久就打脸了,我发现我错的有多离谱了... 先是太不仔细,没有考虑桟空的情况,存在桟空时仍 pop() 的情况,导致程序崩掉 后来又WA,发现我有细节没有考虑到,就是输入代表组数的数字以后,应该要用 getchar()吃掉一个回车 想着这样改完应该没问题了吧?结果还是WA...于是开始各处找题解了... 我发现在输入字符串的时候,我是用 cin 处理的,但几乎所有题解,都是用的 getline() 接着,突然惊觉,好像题目有说,空串合法,而 cin 是不能处理空串的,突然我就有点冷汗直冒了,太不仔细了 但是转念一想,发现一件更可怕的事情,其实我一开始就知道可以输入空串的,我真正的问题在于: “我居然忘记了,cin是不能输入空串的,只有 getline() 才可以!!!” 想起之前做小白书上的题时,尤其 STL 那一章时,其实是各种输入格式都来了个遍的,我以为我应该已经很熟悉 cin、getline(cin, s)、cin.get() 、cin.getline()这些函数了,毕竟题目都做了那么多了... 然而做到数据结构章节时,还是忘掉很多了...难怪温故知新,温故在前,知新在后。难怪说好记性不如烂笔头,好在我之前的题解都存了下来,写在了博客上。我决定以后刷题前,先找自己之前做过的题瞄几眼,看看自己还会不会做,再做新的 --------------------------言归正传的分界线-------------------------- cin:遇到空格,回车或者制表符就会结束输入,这样就导致了我们不能输入一个带有空格的字符串。 cin.get(),cin.getline() :都表示每次读取一行字符串输入。 cin.getline()和cin.get() 这两个函数都读取一行输入,直到达到换行符。然而,随后cin.getline()将丢弃换行符,而cin.get()将换行符保留在输入序列中。 (摘自: http://blog.csdn.net/elohims/article/details/23560743 ) 从函数原型可以看出来cin.getline和cin.get只能接受C风格的字符串 若想读取字符串到C++string 对象中,可以用 getline() 函数 */
/* 查阅过的超链接的保存: http://blog.csdn.net/elohims/article/details/23560743 http://bbs.csdn.net/topics/390858357 https://zhidao.baidu.com/question/362328053.html http://blog.csdn.net/testing2007/article/details/5314653 http://www.cnblogs.com/wlzy/p/5897742.html */
#include <iostream> #include <string> #include <stack> #define rep(i, n) for ( int i = 0; i < (n); i++ ) using namespace std; string s; bool solve() { stack<char> tp; // tp: temp int len = (int) s.size(); rep(i, len) { switch( s[i] ) { case '(': case '[': tp.push( s[i] ); break; case ')': if ( tp.empty() || tp.top() != '(' ) return false; //注明一下,这样的写法不会有错,不会在桟空时仍对其取 top()的,原因可搜索 "逻辑运算符 短路效应" tp.pop(); break; case ']': if ( tp.empty() || tp.top() != '[' ) return false; tp.pop(); break; } } if (tp.empty()) return true; else return false; } int main () { int n; cin >> n; getchar(); while (n--) { // cin >> s; //绝对不能用 cin 的,我当时是遗忘了知识才会本能用 cin ,现在十分惭愧 getline(cin, s); if ( solve() ) cout << "Yes" << endl; else cout << "No" << endl; } }