我已经落后整体进度两天了,今天开始好好刷题。
UVA 673 - Parentheses Balance
Description给定一串由()和[]组成的字符串。如果我们规定以下的字符串是合法的字符串:(1) 如果是空串,那么合法字符串。
(2) 如果A、B是合法的,那么AB也是合法的字符串。
(3) 如果A是合法的,那么(A)和[A]都是合法的字符串。
换言之,如果字符串中离任一一个右括号(即')'或者’]')的最近的未配对左括号是配对的,且所有左右括号都已配对,那么它就是一个合法的字符串。Input输入先是一个正整数n,代表有n个字符串。
接下来是n行字符串,每个字符串一行,注意, 可能有空串。Output对于每组数据,若是合法的字符串,则在单独的一行输出Yes,反之则输出No。Sample Input
4 ([]) (([()]))) ([()[]()])() (([(])))Sample Output
Yes No Yes No
这道题卡了两天,其实很简单,就是入栈和出栈。WA点在于用了fflush(stdin)来刷新缓冲区,google后发现原因可能为因为fflush会清掉整个缓冲区,而在线提交的原理就是把一大堆测试数据放
缓冲区一个一个读的。换成getchar之后AC。
AC代码:
#include <bits/stdc++.h>
using namespace std;
char st[100000000] {};
int main()
{
int t;
cin >> t;
getchar();
while(t--)
{
cin.getline(st,100000);
stack <char> balance;
int length = strlen(st);
for (int i = 0; i < length; i++)
{
if (st[i] == ' ')
continue;
else if (st[i] == '(' || st[i] == '[')
balance.push(st[i]);
else if (st[i] == ')')
{
if (balance.size() && balance.top() == '(')
balance.pop();
else
balance.push(st[i]);
}
else if (st[i] == ']')
{
if (balance.size() && balance.top() == '[')
balance.pop();
else
balance.push(st[i]);
}
}
if (balance.size())
cout << "No\n";
else
cout << "Yes\n";
}
return 0;
}
啊。。卡地牢题了,经典bfs,思路很清晰,然而找不到错在哪。。明天再调吧。。