括号匹配
时间限制: 1 Sec 内存限制: 0 MB
提交: 41 解决: 17
[提交][状态][讨论版]
题目描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
多组输入数据, 每组输入数据都是一个字符串S(S的长度小于10000, 且S不是空串), 数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的, 则输出Yes,如果不配对则输出No
样例输入
[(])
(])
([[]()])
样例输出
No
No
Yes
网址 http://nyoj.top/problemset
题意:查找一行括号序列是否匹配
思路:首先我们可以先把这一行括号序列存在字符串中,计算字符的长度,并用一个标志位标志括号匹配的情况,然后判断字符串的长度是否是偶数(奇数不可能匹配),用一个fou循环遍历每一个括号,如果是左括号就把它存入另一个数组中,如果是右小括号就判断它的前一个括号是否为左小括号,否就结束循环并把标志位变一下,是就把它减掉。如果是右大括号同理。最后判断标志位,否就是no,是 再判断字符串的长度是否为0(因为可能出现((((((【【】】))这种情况),是yes,否no。
代码
方法一:stack
#include<iostream> //c++的头文件
#include<stack> //栈的头文件
#include<string> //字符串的头文件
using namespace std;
int main()
{
string a; //定义一个字符串a
stack<char> s; //定义一个字符型的栈s
int n,flag;
cin>>n;
while(n--)
{
flag=1; //标志位
while(!s.empty()) //栈不为空的时候循环(清空栈中的元素以便存入新的元素)
{
s.pop(); //输出首元素
}
cin>>a; //输入字符串a
for(int i=0;i<a.length();i++)
{
if(a[i]=='('||a[i]=='[') //如果是左括号把它(a[i])存在栈里面
{
s.push(a[i]);
}
else //如果是右括号
{
if(s.size()==0) //如果没有左括号也没有右括号(即这种情况“[[[[[[”)
{
flag=0;
break;
}
if((s.top()=='['&&a[i]==']')||(s.top()=='('&&a[i]==')')) //左括号存完之后,找与之相配的右括号。如果相匹配输出
s.pop();
else //如果不匹配,
{
flag=0;
break;
}
}
}
if(flag==0||(!s.empty())) //如果flag=0(不匹配)或者栈不为空(无法匹配完例如“{{{{{{{[[]]}")
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}
方法二:数组
#include<stdio.h>//c语言头文件
#include<string.h> //字符串函数头文件
int main()
{
char a[10000],b[10000];//定义两个字符数组
int i,j,flag=1,t;
while(scanf("%s",a)!=EOF)//多实例测试
{
flag=1;j=0;
t=strlen(a);//求出字符串的长度
if (t%2==0)//字符串的长度为偶数才可能匹配
{
for(i=0;i<t;i++)
{
if(a[i]=='('||a[i]=='[')//如果是左括号把它存到另一个数组b[i]里面
{
j++;
b[j]=a[i];
}
if(a[i]==')')//如果是右小括号,找与之匹配的左小括号
{
if(b[j]=='(')//如果匹配,减掉
j--;
else//否则,把标志位变成0,结束循环
{
flag=0;break;}
}
if(a[i]==']')//如果是右大括号,找与之匹配的左大括号
{
if(b[j]=='[')//如果匹配,减掉
j--;
else//否则,把标志位变成0,结束循环
{
flag=0;break;
}
}
}
if(flag==0)
printf("No\n");
else
{
if(j==0)
printf("Yes\n");
else//j不等于0即没有匹配完(例如“[[[[[{{{{}}]]”)
printf("No\n");
}
}
else//奇数不可能匹配成功
printf("No\n");
}
return 0;
}
**运算结果**
总结: