括弧マッチングアルゴリズムの1つの正しい実装(java)

3795 ワード

本人は1つの文字列の中で括弧が対になって現れるかどうかを判断しなければならなくて、正則が満足できないかそれとも正規表現が複雑すぎて、Javaアルゴリズムで実現するしかないことを発見して、ネット上でいくつかのコードを探して、適当でないかを発見します。

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

public class matchJudger
{
    // pair     key,      
    private Map pair = null;

    public matchJudger()
    {
        pair = new HashMap();
        pair.put(')', '(');
        pair.put('}', '{');
        pair.put(']', '[');
    }

    public boolean isMatch(String s)
    {
        Stack sc = new Stack();
        for (int i = 0; i < s.length(); i++)
        {
            Character ch = s.charAt(i);
            if (pair.containsValue(ch))//       ,    
            {
                sc.push(ch);
            } else if (pair.containsKey(ch)) //       
            {
                if (sc.empty()) //    ,            
                {
                    return false;
                }
                //     ,          
                if (sc.peek() == pair.get(ch))
                {
                    sc.pop();
                } else //           else   ,  ({}[]]])     true
                { //     ,           
                    return false;
                }
            }

        }

        return sc.empty() ? true : false;
    }

    public static void main(String[] args)
    {
        matchJudger judger = new matchJudger();
        System.out.println(judger.isMatch("(***)-[{-------}]")); //true
        System.out.println(judger.isMatch("(2+4)*a[5]")); //true
        System.out.println(judger.isMatch("({}[]]])")); //false
        System.out.println(judger.isMatch("())))")); //false
    }

}