【题】数据结构:检查符号是否成对出现

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串,判断该字符串是否有效。
有效字符串需满足:
(1)左括号必须用相同类型的右括号闭合。
(2)左括号必须以正确的顺序闭合。
比如 “()”、“()[]{}”、“{[]}” 都是有效字符串,而 “(]” 、“([)]” 则不是。

我们可以利用栈 Stack 来解决这个问题。
(1)首先我们将括号间的对应规则存放在 Map 中;
(2)创建一个栈。遍历字符串,如果字符是左括号就直接加入stack中,否则将stack 的栈顶元素与这个括号做比较,如果不相等就直接返回 false。遍历结束,如果stack为空,返回 true。

public class Test {
    
    

    public static void main(String[] args) {
    
    
        System.out.println("()[]{}  符号是否成对出现:" + isValid("()[]{}"));
        System.out.println("{[]}    符号是否成对出现:" + isValid("{[]}"));
        System.out.println("(]      符号是否成对出现:" + isValid("(]"));
        System.out.println("([)]    符号是否成对出现:" + isValid("([)]"));
    }

    public static boolean isValid(String s){
    
    
        // 括号之间的对应规则
        HashMap<Character, Character> mappings = new HashMap<Character, Character>();
        mappings.put(')', '(');
        mappings.put('}', '{');
        mappings.put(']', '[');

        Stack<Character> stack = new Stack<Character>();

        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
    
    
            /**
             * 如果字符不是右半部分(是左半部分)则压入栈中
             */
            if (mappings.containsKey(chars[i])) {
    
    
                char topElement = stack.empty() ? '#' : stack.pop();
                /**
                 * 将当前字符与栈顶进行比较
                 */
                if (topElement != mappings.get(chars[i])) {
    
    
                    return false;
                }
            } else {
    
    
                stack.push(chars[i]);
            }
        }
        return stack.isEmpty();
    }

}

输出结果为:

()[]{
    
    }  符号是否成对出现:true
{
    
    []}    符号是否成对出现:true
(]      符号是否成对出现:false
([)]    符号是否成对出现:false

猜你喜欢

转载自blog.csdn.net/qq_29229567/article/details/127495841