【发布时间】:2016-05-30 05:02:28
【问题描述】:
问题:
给定一个由括号组成的序列,判断表达式是否平衡。如果每个开括号都可以唯一地与出现在前者之后的闭括号配对,则括号序列是平衡的。此外,它们之间的间隔必须平衡。您将获得三种类型的括号:(、{ 和 [.
{[()]} - 这是一个平衡括号。
{[(])} - 这不是平衡括号。
输入格式:
*输入的第一行包含测试用例的数量。
*每个测试用例由一行括号组成。
stack <char> stk;
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int n;
cin>>n;
for(int i=0;i<n;i++)
{
string s;
cin>>s;cout<<s;
int j=0;
while(j!=s.length())
{
if(stk.size()==0&&(s[j]==')'||s[j]==']'||s[j]=='}'))
{stk.push('z');}
if(s[j]=='('||s[j]=='['||s[j]=='{')
stk.push(s[j]);
if(stk.top()=='('&&s[j]==')')
stk.pop();
if(stk.top()=='['&&s[j]==']')
stk.pop();
if(stk.top()=='{'&&s[j]=='}')
stk.pop();
j++;
}
if(stk.size()==0)
cout<<"YES"<<endl;
else
{
cout<<"NO"<<endl;
while(stk.size()!=0)
stk.pop();
}
}
return 0;
}
这是一个检查平衡括号的代码。它适用于以“{”开头的字符串,但使用“[]”之类的字符串失败
【问题讨论】:
-
您可以将布尔值
invalid设置为 true 并在循环之外执行break;而不是stk.push('z')。 -
这里有一个线索:尝试交换:
if(stk.top()=='['&&s[j]==']')和if(stk.top()=='{'&&s[j]=='}'),看看情况如何变化。 -
PS:这个问题可以通过使用短路布尔求值轻松解决。
-
@Cheersandhth.-Alf,这并不能真正帮助解决问题。谢谢
-
@CraigYoung,那个人做到了。谢谢!