1079: 括弧匹配检验
时间限制: 1 Sec 内存限制: 128 MB
[提交][状态][讨论版][命题人: 外部导入]题目描述
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK”,不匹配就输出“Wrong”。
输入一个字符串:[([][])],输出:OK
输入
输入仅一行字符(字符个数小于255)
输出
匹配就输出 “OK” ,不匹配就输出“Wrong”。
扫描二维码关注公众号,回复: 9514048 查看本文章样例输入
[(])样例输出
Wrong来源
此题常规循环一看就很难做,但是括号匹配容易让人想到栈,考虑用栈来写。
#include <iostream>
#include<cstring>
#include<stack>
using namespace std;
//<>,(),[],{}
char fan(char a){
if(a=='<')
return '>';
else if (a=='(')
return ')';
else if(a=='[')
return ']';
else if(a=='{')
return '}';
else if(a=='>')
return '<';
else if (a==')')
return '(';
else if(a==']')
return '[';
else if(a=='}')
return '{';
}
int main(int argc, char *argv[])
{
char s[256];
int n,j,i;
scanf("%d",&n);
for(i=0;i<n;i++){
stack <char> a;
scanf("%s",s);
int l=strlen(s);
for(j=0;j<l;j++){
if(a.empty()){
if(s[j]=='<'||s[j]=='('||s[j]=='['||s[j]=='{')
a.push(s[j]);
else{
printf("NO\n");
break;
}
}
else{
if(s[j]=='<'||s[j]=='('||s[j]=='['||s[j]=='{'){
if(s[j]=='{'&&(a.top()=='{'))
a.push(s[j]);
else if(s[j]=='['&&(a.top()=='['||a.top()=='{'))
a.push(s[j]);
else if(s[j]=='('&&(a.top()=='('||a.top()=='['||a.top()=='{'))
a.push(s[j]);
else if(s[j]=='<'&&(a.top()=='<'||a.top()=='('||a.top()=='['||a.top()=='{'))
a.push(s[j]);
}
else{
if(a.top()!=fan(s[j])){
printf("NO\n");
break;
}
else
a.pop();
}
}
}
if(j==l&&a.empty())
printf("YES\n");
else if(j==l)
printf("NO\n");
}
return 0;
}