题目:给一段仅含有'('、')'、'['、']'、'{'、'}'的序列,判断其是否合法(这段序列能否分成若干对对应的括号、并且每对括号之间也是一段合法的括号序列)。例如:()[{}]是一段合法的括号序列。而:([)]则是一段不合法的括号序列。序列长度不超过10000。
输入格式
一行一个括号序列。
输出格式
合法输出Yes,否则输出No。
样例输出
Yes
提示
提示:1.使用“栈”这种数据结构判断一段括号序列是否合法。2.左括号可以视为进栈、右括号可以视为出栈。
#include <iostream>
#include <cstring>
#include <stack>
char e[100010];
using namespace std;
int main()
{
scanf("%s",e+1);//e+1的含义为从一开始输入数组
int n=strlen(e+1);
stack<char> stk;//设定栈 stk
int ans=0;//利用ans的值达到判断的目的
for(int i=1;i<=n;i++)
{
if(e[i]==')')
{
if(stk.empty()||stk.top()!='(')//栈内为空的时候还输入左括号就已经错了,并且栈内顶部没有对应右括号也为错误 即为不符合题意
{
ans=1;
break;
}
stk.pop();//有对应的右括号就将栈顶部的的左括号删除(需要注意的是只有左括号才能入栈)
}
else if(e[i]=='}')//同理可得
{
if(stk.empty()||stk.top()!='{')
{
ans=1;
break;
}
stk.pop();
}
else if(e[i]==']')//同理
{
if(stk.empty()||stk.top()!='[')
{
ans=1;
break;
}
stk.pop();
}
else//左括号入栈 **重点只有左括号入栈
{
stk.push(e[i]);//将其入栈
}
}
if(ans==0&&stk.empty())//仅仅当ans依旧为0并且前面入栈的所有左括号都清空了才算合法
{
cout<<"Yes";
}
else//否则不合法
{
cout<<"No";
}
return 0;
}
一切尽在代码中@v@
有啥更优解敬请指正