题目大意
说白了就是括号匹配(红题)。
分析&解决
都做过括号匹配吧,提供两种方法:
- 栈做法
- 非栈做法
栈做法
遇到左括号压入栈。
遇到右括号时,如果站内有左括号,则将栈顶弹出,如果栈是空的,则直接输出错。
遍历完整个序列,如果栈是空的,输出对,反之,输出错。
代码如下。
#include<bits/stdc++.h>
using namespace std;
string s;
stack<int> st;
int main()
{
cin>>s;
int n=s.size();
for(int i=0;i<n;i++)
{
if(s[i]=='(')st.push(1);
if(s[i]==')')
{
if(st.empty())
{
cout<<"NO";
return 0;
}
else st.pop();
}
}
if(st.empty())cout<<"YES";
else cout<<"NO";
return 0;
}
非栈做法(一个变量搞定)
我们用一个变量来记录。
遇到左括号就就将变量加一。
遇到右括号,如果变量为零,输出错,反之,就将变量减一。
遍历完整个序列,如果变量为零,输出对,反之,输出错。
代码如下。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
int a=0,n=s.size();
for(int i=0;i<n;i++)
{
if(s[i]=='(')a++;
if(s[i]==')')
{
if(a!=0)a--;
else
{
cout<<"NO";
return 0;
}
}
}
if(a==0)cout<<"YES";
else cout<<"NO";
return 0;
} 
京公网安备 11010502036488号