1079: 括弧匹配檢驗
時間限制: 1 Sec 內存限制: 128 MB
[提交][狀態][討論版][命題人: 外部導入]
題目描述
假設表達式中允許包含兩種括號:圓括號和方括號,其嵌套的順序隨意,如([]())或[([][])]等爲正確的匹配,[(])或([]()或(()))均爲錯誤的匹配。
現在的問題是,要求檢驗一個給定表達式中的括弧是否正確匹配?
輸入一個只包含圓括號和方括號的字符串,判斷字符串中的括號是否匹配,匹配就輸出 “OK”,不匹配就輸出“Wrong”。
輸入一個字符串:[([][])],輸出:OK
輸入
輸入僅一行字符(字符個數小於255)
輸出
匹配就輸出 “OK” ,不匹配就輸出“Wrong”。
樣例輸入
[(])樣例輸出
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;
}
此題爲棧入門題,對於常規的棧增加了括號數量與括號順序。
這題還沒想到很快的方法。。。這麼長的代碼寫的頭都痛了。。。。