-
总时间限制:
- 1000ms 内存限制:
- 1000kB
-
描述
-
假设表达式中只包含三种括号:圆括号、方括号和花括号,它们可相互嵌套,如([{}])或({[][()]})等均为正确的格式,而{[]})}或{[()]或([]}均为不正确的格式.
输入一串括号
如果输入的右括号多余,输出:Extra right brackets
如果输入的左括号多余, 输出:Extra left brackets
如果输入的括号不匹配,输出:Brackets not match
如果输入的括号匹配,输出:Brackets match
输入
- {{{{))) 输出
- Brackets not match 样例输入
-
{([)]}
样例输出
-
Brackets not match
提示
- 利用栈结构
思路:
如果通过左边括号来匹配,会有很多种情况,例如小括号里面还可以包含小括号,不好判断。因为符号是左边括号和右边括号分离开的,如果先将左括号压栈,通过右边的括号来进行匹配会方便很多。
具体思路
对符号串进行遍历,利用栈结构,遇到左边括号就进行压栈,遇到右边的括号(说明左边括号已经压栈完毕,后面不会再有左边括号)就取栈顶元素进行匹配,如果不匹配,那么就是Brackets not match,如果栈为空,说明右边括号多了为Extra right brackets,遍历完毕后判断栈是否为空,如果为空说明匹配成功,否则说明左括号对了为Extra left brackets
上代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
stack<char> s;
int len;
char a[10005]= {0},t;
gets(a);
len=strlen(a);
for(int i=0; i<len; i++)
{
if(a[i]=='('||a[i]=='['||a[i]=='{')
s.push(a[i]);
else if(a[i]==')')
{
if(s.empty())
{
cout<<"Extra right brackets"<<endl;
return 0;
}
t=s.top();
if(t=='(')
s.pop();
else
{
cout<<"Brackets not match"<<endl;
return 0;
}
}
else if(a[i]==']')
{
if(s.empty())
{
cout<<"Extra right brackets"<<endl;
return 0;
}
t=s.top();
if(t=='[')
s.pop();
else
{
cout<<"Brackets not match"<<endl;
return 0;
}
}
else if(a[i]=='}')
{
if(s.empty())
{
cout<<"Extra right brackets"<<endl;
return 0;
}
t=s.top();
if(t=='{')
s.pop();
else
{
cout<<"Brackets not match"<<endl;
return 0;
}
}
}
if(s.empty())
cout<<"Brackets match"<<endl;
else
{
t=s.top();
if(t=='{'||t=='['||t=='(')
cout<<"Extra left brackets"<<endl;
}
return 0;
}