WLACM 1079: 括弧匹配检验 栈入门
1079: 括弧匹配检验
时间限制: 1 Sec 内存限制: 128 MB
[提交][状态][讨论版][命题人: 外部导入]
题目描述
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK”,不匹配就输出“Wrong”。
输入一个字符串:[([][])],输出:OK
输入
输入仅一行字符(字符个数小于255)
输出
匹配就输出 “OK” ,不匹配就输出“Wrong”。
样例输入
[(])样例输出
Wrong来源
此题常规循环一看就很难做,但是括号匹配容易让人想到栈,考虑用栈来写。
1 #include <iostream> 2 #include<cstring> 3 #include<stack> 4 using namespace std; 5 //<>,(),[],{} 6 char fan(char a){ 7 if(a=='<') 8 return '>'; 9 else if (a=='(') 10 return ')'; 11 else if(a=='[') 12 return ']'; 13 else if(a=='{') 14 return '}'; 15 else if(a=='>') 16 return '<'; 17 else if (a==')') 18 return '('; 19 else if(a==']') 20 return '['; 21 else if(a=='}') 22 return '{'; 23 24 } 25 int main(int argc, char *argv[]) 26 { 27 char s[256]; 28 int n,j,i; 29 scanf("%d",&n); 30 for(i=0;i<n;i++){ 31 stack <char> a; 32 scanf("%s",s); 33 int l=strlen(s); 34 for(j=0;j<l;j++){ 35 if(a.empty()){ 36 if(s[j]=='<'||s[j]=='('||s[j]=='['||s[j]=='{') 37 a.push(s[j]); 38 else{ 39 printf("NO\n"); 40 break; 41 } 42 } 43 else{ 44 if(s[j]=='<'||s[j]=='('||s[j]=='['||s[j]=='{'){ 45 if(s[j]=='{'&&(a.top()=='{')) 46 a.push(s[j]); 47 else if(s[j]=='['&&(a.top()=='['||a.top()=='{')) 48 a.push(s[j]); 49 else if(s[j]=='('&&(a.top()=='('||a.top()=='['||a.top()=='{')) 50 a.push(s[j]); 51 else if(s[j]=='<'&&(a.top()=='<'||a.top()=='('||a.top()=='['||a.top()=='{')) 52 a.push(s[j]); 53 } 54 else{ 55 if(a.top()!=fan(s[j])){ 56 printf("NO\n"); 57 break; 58 } 59 else 60 a.pop(); 61 62 } 63 } 64 65 66 67 68 } 69 if(j==l&&a.empty()) 70 printf("YES\n"); 71 else if(j==l) 72 printf("NO\n"); 73 } 74 return 0; 75 }
此题为栈入门题,对于常规的栈增加了括号数量与括号顺序。
这题还没想到很快的方法。。。这么长的代码写的头都痛了。。。。
浙公网安备 33010602011771号