判断括号是否匹配:给定 n 组数,每组为一个字符串,测试 3 种括号:{}、[]、(),且顺序只能是前左括号,后右括号,括号间可以嵌套。若匹配则输出 yes,否则输出 no;
如:{@}[a](4)、{[()]} 都是匹配的;
{[[]}、{}{ 都是不匹配的。
#include <stdio.h>
#include <stack>
#include <string.h>
#include <iostream>
using namespace std;
const int maxn = 20;
bool Judge(char str[][maxn], int n)
{
stack<char> s;
while(!s.empty())//初始化栈
{
s.pop();
}
int len = strlen(str[n]);
for(int i = 0; i < len; i++)
{
if(str[n][i] == '(' || str[n][i] == '[' || str[n][i] == '{')
{
s.push(str[n][i]);
}
else if(str[n][i] == ')')
{
char temp = s.top();
if(temp != '(')
{
return false;
}
s.pop();
}
else if(str[n][i] == ']')
{
char temp = s.top();
if(temp != '[')
{
return false;
}
s.pop();
}
else if(str[n][i] == '}')
{
char temp = s.top();
if(temp != '{')
{
return false;
}
s.pop();
}
}
return s.empty(); //这样写方便
}
int main(void)
{
int n;
scanf("%d", &n);
getchar();
char str[n][maxn];
for(int i = 0; i < n; i++)
{
scanf("%s", str[i]);
}
for(int i = 0; i < n; i++)
{
bool flag = Judge(str, i);
if(flag)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}