括号配对问题——解题心得

Description

You are given a string consisting of parentheses () and []. A string of this type is said to be correct:

(a)if it is the empty string
(b)if A and B are correct, AB is correct,
(c)if A is correct, (A ) and [A ] is correct.

Write a program that takes a sequence of strings of this type and check their correctness. Your program can assume that the maximum string length is 128.

Input

The file contains a positive integer n and a sequence of n strings of parentheses () and [], one string a line.

Output

A sequence of Yes or No on the output file.

Sample Input

3

([])

(([()])))

([()[]()])()

Sample Output

Yes
No
Yes

解题思路:

注意:

1、匹配的括号序列长度必然为偶数

2、第一个括号必须为左括号(‘(‘ 或 ‘[‘ )

3、括号不会交叉嵌套出现(如:([)] 就不符合),具有对称性。

4、一行若是“\n“字符串也输出"Yes"。

如果我们当前看到了一个左括号,则我们不能判断其与哪个括号匹配,因为与之匹配的括号必定在其后面,因此我们还需要向后搜索。但是当我们看到一个右括号的时候,我们必然可以判断其与前面哪个括号匹配(或者找不到匹配)。因此我们的第一个匹配是从后面第一个右括号开始的,当我们找到一对匹配的括号的时 候,我们就可以把这对括号消除,然后继续找下一个右括号,继续消除,直到算法结束。显然我们遇到的第一个右括号必定与其前一个括号匹配,否则不满足第三条 规则。当我们删除了第一个匹配的括号之后,剩下的括号形成了一个新的序列。于是可以应用上面的思路继续经行匹配。

特征:后面的括号先被删除,最前面的括号最后被删除。这个规则符合栈的后进先出的规则。

程序代码:

 #include <iostream>
  #include <cstdio>
  #include <stack>
  #include <cstring>
  using namespace std;
  char str[200];

  bool judge(char x,char y)
  {
      if (x==‘[‘&&y==‘]‘)   return 1;
    if (x==‘(‘&&y==‘)‘)   return 1;
    return 0;
  }

  bool left(char x)
  {
      if( x==‘[‘||x==‘(‘)   return 1;
      return 0;
  }
  int main()
  {
      int t;cin>>t;
      getchar();
      while(t--)
      {
          stack<char>s;
          gets(str);
           if(strcmp(str,"\n")==0)    {cout<<"Yes"<<endl;continue;}
         for(int i=0;i<strlen(str);i++)
          {
             if(s.empty())      //判断栈是否为空
                s.push(str[i]);
             else
                if (!judge(s.top(),str[i]))
             {
                 if(left(str[i]))
                    s.push(str[i]);
             }
             else s.pop();

          }
          if(s.empty()) cout<<"Yes"<<endl;
          else cout<<"No"<<endl;
      }
      return 0;
  }
时间: 2024-10-11 17:11:37

括号配对问题——解题心得的相关文章

NYOJ 2 括号配对问题

/* 题目大意:求括号是否配对 解题思路:开一个数组b,来作为栈,top为栈的下个下标控制入栈和出栈 难点详解:见代码 关键点:对进栈和出栈了解深刻一点 解题人:lingnichong 解题时间:2014/08/15  19:46:45 解题体会:最基本栈的运用.一开始还不是很清楚.可以先背一下,每天睡觉前再看一下,到用的时候,再根据这个模板写出来就可以了,这样印象会更加深刻了 */ #include<stdio.h> #include<string.h> #define MAXN

第四章学习小结 串的模式匹配 解题心得体会

串的模式匹配 解题心得体会 关于串,模式匹配是其一个很重要的问题.针对这个问题,书上讲了两种模式匹配的算法,即BF算法和KMP算法,下面针对这两种算法的实现谈谈我的心得. 一.BF算法的探索 [错误代码1] #include<iostream> #include<string.h> using namespace std; typedef struct{ char ch[1000002]; int length; }SString; void Index_BF(SString S,

ACM:UESTC - 649 括号配对问题 - stack

  UESTC - 649  括号配对问题 Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu Description 大家都知道算术表达式中,括号必须配对,现在任意给出一个算术表达式,判断其括号是否配对.如果配对,输出Yes,否则输出No. Input 含多组测试数据,输入首先是一个整数T表示测试数据组数(0<T≤300).随后有T行测试数据,长度不超过1000个字符,字符串间不含空格. Out

ACM:括号配对问题

括号配对问题:http://acm.nyist.net/JudgeOnline/problem.php?pid=2 思路:利用栈先进后出的性质,左符入,右符出. #include<iostream> #include<string> #include<stack> using namespace std; bool check(string str) { stack<char> stack; for (int i = 0; i < str.length

NYOJ 2 括号配对问题【栈的运用】

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

nyist 2 括号配对问题

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

NYOJ2 括号配对问题

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

括号配对问题--nyoj-题目2

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

NYOJ题目2括号配对问题

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,