这里举了两个例子,都是用栈做的,题目很水,就不过多解释了,相信大佬们都能看懂。
(1)
Description
现在有一种只包括左右小括号(“(”和“)”)和空格(” “)的字符串序列,请你判断括号是否匹配,如果匹配就输出Yes,不匹配输出No。
Input
输入数据第一行输入一个T(0≤T≤100),表示测试数据的组数。
接下来有T行测试数据,每行有一个符合题意的字符串,字符串长度不超过500。
Output
每组测试数据,先输出一个”Case %d:“,%d表示第几组测试数据。接着,如果字符串括号匹配,输出Yes,否则,输出No。具体输出格式参考下面输出样例。
Sample Input
2
( ())
)(
Sample Output
Case 1:Yes
Case 2:No
代码如下:
#include <iostream>
#include <stack>
#include <stdio.h>
using namespace std;
int main()
{
stack<char>sk1,sk2;
int t;
cin>>t;
getchar();
for(int i=1; i<=t; i++)
{
while(!sk1.empty())
sk1.pop();
while(!sk2.empty())
sk2.pop();
int flag=1;
char a[5000];
gets(a);
cout<<"Case "<<i<<":";
for(int j=0; a[j]; j++)
{
if(a[j]=='(')
sk1.push(a[j]);
else if(a[j]==')')
if(sk1.empty()==0)
sk1.pop();
else
sk2.push(a[j]);
}
if(sk1.empty()&&sk2.empty())
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
<iostream>
#include <stack>
#include <stdio.h>
using namespace std;
int main()
{
stack<char>sk1,sk2;
int t;
cin>>t;
getchar();
for(int i=1; i<=t; i++)
{
while(!sk1.empty())
sk1.pop();
while(!sk2.empty())
sk2.pop();
int flag=1;
char a[5000];
gets(a);
cout<<"Case "<<i<<":";
for(int j=0; a[j]; j++)
{
if(a[j]=='(')
sk1.push(a[j]);
else if(a[j]==')')
if(sk1.empty()==0)
sk1.pop();
else
sk2.push(a[j]);
}
if(sk1.empty()&&sk2.empty())
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
(2)
Description
假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”,方括号“[”和“]”和花括号“{”和“ ”,且这三种括号可按任意的次序嵌套使用(如:…[…{… …[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法。输出结果YES 或者 NO。
Input
5+{[2X5]+2}
Output
YES
Sample Input
8-[{2+7]}
Sample Output
NO
代码如下:
#include <iostream>
#include <stack>
#include <stdio.h>
using namespace std;
int main()
{
stack<char>sk1,sk2;
int flag=1;
char a[5000];
gets(a);
for(int j=0; a[j]; j++)
{
if(a[j]=='('||a[j]=='{'||a[j]=='[')
sk1.push(a[j]);
else if(a[j]==')')
if(sk1.empty()==0&&sk1.top()=='(')
sk1.pop();
else
sk2.push(a[j]);
else if(a[j]=='}')
if(sk1.empty()==0&&sk1.top()=='{')
sk1.pop();
else
sk2.push(a[j]);
else if(a[j]==']')
if(sk1.empty()==0&&sk1.top()=='[')
sk1.pop();
else
sk2.push(a[j]);
}
if(sk1.empty()&&sk2.empty())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
<iostream>
#include <stack>
#include <stdio.h>
using namespace std;
int main()
{
stack<char>sk1,sk2;
int flag=1;
char a[5000];
gets(a);
for(int j=0; a[j]; j++)
{
if(a[j]=='('||a[j]=='{'||a[j]=='[')
sk1.push(a[j]);
else if(a[j]==')')
if(sk1.empty()==0&&sk1.top()=='(')
sk1.pop();
else
sk2.push(a[j]);
else if(a[j]=='}')
if(sk1.empty()==0&&sk1.top()=='{')
sk1.pop();
else
sk2.push(a[j]);
else if(a[j]==']')
if(sk1.empty()==0&&sk1.top()=='[')
sk1.pop();
else
sk2.push(a[j]);
}
if(sk1.empty()&&sk2.empty())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
萌新代码,请多指教^_^