括号配对问题

来源:互联网 发布:数据库安全系统 编辑:程序博客网 时间:2024/04/28 21:13

/******************************************************************************
*@Description: 括号配对问题  时间限制:3000 ms  |  内存限制:65535 KB
*难度:3
*描述
*现在,有一行括号序列,请你检查这行括号是否配对。
*输入
*第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每
*组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。
*数据保证S中只含有"[","]","(",")"四种字符
*输出
*每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配
*对则输出No
*样例输入
*3
*[(])
*(])
*([[]()])样例输出
*No
*No
*Yes
*@Author: Steven
*@datetime: 2013-05-30
*******************************************************************************/

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <cstring>

const int g_rows = 5;
const int g_cols = 40;

void calculate(void);
bool isMatch(char *p);

int main()
{
 calculate();

 return 0;
}

///////////////////////////////////////
void calculate(void)
{
 char ch[g_rows][g_cols];
 int n, i;

 cin>>n;
 for (i = 0; i < n; i++)
 {
  cin>>ch[i];
 }

 for (i = 0; i < n; i++)
 {
  if (isMatch(&ch[i][0]))
  {
   cout<<"Yes"<<endl;
  }
  else
  {
   cout<<"No"<<endl;
  }
 }
}

////////////////////////////////////////
//判断一个字符串是否是括号配对
bool isMatch(char *p)
{
 int length, i, j;

 length = strlen(p);
 char stack[g_cols] = {'\0'};//声明一个栈用来存储未配对的符号

 for (i = 0, j = 0; i < length; i++)
 {
  //先将第一个元素入栈
  if (i == 0)
  {
   stack[0] = p[i];
   continue;
  }
  //出栈
  if ((stack[j]=='(' && p[i]==')') || (stack[j]=='[' && p[i]==']'))
  {
   j--;
  }
  //入栈
  else
  {
   stack[++j] = p[i];
  }
 }

 //判断栈是否为空
 if (j == -1)
 {
  return true;
 }
 else
 {
  return false;
 }
}
 

 

原创粉丝点击