ECNU 2449 sunny的食品罐

ECNU 2449 sunny的食品罐

链接

https://acm.ecnu.edu.cn/problem/2449

题目

单点时限: 2.0 sec

内存限制: 256 MB

sunny 非常喜欢吃零食,有时候会一下子买好多零食,所以有些会吃不完,本着节约的原则,他把这些吃不完的零食用特殊的罐头装起来,等以后再吃。罐头有三种,分别用{},[],() 表示,当罐头里面装了零食之后,就变成了{CHOCOLATE}, 或者 [ POTATOCHIPS], 或者 (COKE), 这种罐头的材质很特殊,对食品不会产生污染,所以可以把食品用罐头装起来之后,放到另一个装有食品的罐头里,例如{CHOCOLATEPOTATOCHIPS}, 其中 CHOCOLATE 被放在{}罐头中,POTATOCHIPS 被放在 [] 罐头中,那么 COKE 当然被放在了 () 罐头中。但是在使用这种罐头的时候必须小心,罐头的盖子必须要盖起来,比如一个罐头的左盖子必须对应该罐头的右盖头,也就是不能出现这种{CHOCOLATE[POTATO(COKE)},食品罐头的盖子没有盖全,会导致里面的食品变质,sunny 就不要吃了。

一天,sunny 从柜子里翻出好多罐子,这都是他以前保存的零食,他怀疑有些罐头由于当初没有盖好盖子,里面的零食已经变质,不能吃了。但是由于数量太多,手工检查起来太麻烦,于是他想请你帮他写个程序,来检测这些罐头里面的食品是否能吃。

特别需要注意的地方:

(1) 左右两个盖子不能互换,比如)COKE(是不允许的 ,[ (APPLE)COKE(ORANGE)] 是允许的 ,COKE 其实是放在 [] 中。

(2) 必须配套使用,用{的左盖子,右盖子一定要是},其他两种盖子也是一样。

(3) 罐头里不放食品是允许的。

(4) 用正确的方法储存起来的食品,将永远不会变质。

(5) 只要用了左盖子,就一定要用右盖子;用了右盖子,也一定要用左盖子,否则也不能正常保存食品。

输入格式
第一行有一个整数 k, 表示有 k 组罐头 (0 < k <= 100)。

第二行到第 k+1 行,每行一个字符串,每个字符串表示一组待检查的罐头,字符串由 ‘A’…’Z’, 以及 ‘{‘,’}’,’[‘,’]’,’(‘,’)’ 组成。题目保证,一组罐头中,至少会有一种零食,一个罐头里只会放一种零食或者不放。(字符串长度不大于 1000)

输出格式
对应每组罐头,输出一行,假如食品还能吃,就输出 “YES”, 否则输出 “NO”.

样例
input
5
{CHOCOLATE[POTATO(COKE)}
{CHOCOLATE}
{CHOCOLATE{CHOCOLATE}
{CHOCOLATE[()}
{CHOCOLATECOKE}
output
NO
YES
NO
NO
YES

思路

标准的栈,先进后出,用括号匹配的思想就行了,左括号入栈,右括号就检测,栈顶是相同的左括号就出栈,不然匹配失败,失败就是no。
匹配到最后,栈也空了,那就是yes

代码

 public static void fun() {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    for (int i = 0; i < n; i++) {
      boolean flag = true;
      String str = sc.next();
      Stack<Character> stack = new Stack<>();
      StringBuffer sb = new StringBuffer(str);
      for (int j = 0; j < sb.length(); j++) {
        char tmp = sb.charAt(j);
        if (tmp == '{' || tmp == '[' || tmp == '(') {
          stack.push(tmp);
        } else if (tmp > 'Z' || tmp < 'A') {
          if (stack.empty()) {
            flag = false;
            break;
          } else {
            if (tmp == '}') {
              if (stack.pop() != '{') {
                flag = false;
                break;
              }
            } else if (tmp == ']') {
              if (stack.pop() != '[') {
                flag = false;
                break;
              }
            } else if (tmp == ')') {
              if (stack.pop() != '(') {
                flag = false;
                break;
              }
            }
          }
        }
      }
      if (flag && stack.empty()) {
        System.out.println("YES");
      } else {
        System.out.println("NO");
      }
    }

  }
原文地址:https://www.cnblogs.com/blogxjc/p/14358772.html