如何检查字符串是否平衡?

2022-09-05 00:03:19

我想测试输入字符串是否平衡。如果有匹配的左括号和右括号、方括号或大括号,则将保持平衡。

example:
{} balanced
() balanced
[] balanced
If S is balanced so is (S)
If S and T are balanced so is ST


public static boolean isBalanced(String in)
{
    Stack st = new Stack();

    for(char chr : in.toCharArray())
    {
        if(chr == '{')
            st.push(chr);

    }

    return false;
}

我在选择做什么时遇到了问题。我是否应该将每个左括号或右括号、方括号或大括号放在一个堆栈中,然后弹出它们?如果我把它们弹出来,这对我有什么帮助?


答案 1

1)对于每个开口支架:将其推到堆栈中。{ [ (

2)对于每个右括号:从堆栈中弹出并检查括号的类型是否匹配。如果不返回} ] )false;

String 中的当前符号是,如果从堆栈中弹出的是其他任何内容,则立即返回。}{false

3) 如果行尾和堆栈不为空,则返回,否则。falsetrue


答案 2

是的,堆栈是任务的合适选择,或者您可以使用递归函数。如果您使用堆栈,那么这个想法是将每个左括号推到堆栈上,当您遇到右括号时,请检查堆栈的顶部是否与它匹配。如果它匹配,请将其弹出,如果不是,则为错误。完成后,堆栈应为空。

import java.util.Stack;
public class Balanced {
    public static boolean isBalanced(String in)
    {
        Stack<Character> st = new Stack<Character>();

        for(char chr : in.toCharArray())
        {
            switch(chr) {

                case '{':
                case '(':
                case '[':
                    st.push(chr);
                    break;

                case ']':
                    if(st.isEmpty() || st.pop() != '[') 
                        return false;
                    break;
                case ')':
                    if(st.isEmpty() || st.pop() != '(')
                        return false;
                    break;
                case '}':
                    if(st.isEmpty() || st.pop() != '{')
                        return false;
                    break;
            }
        }
        return st.isEmpty();
    }
    public static void main(String args[]) {
        if(args.length != 0) {
            if(isBalanced(args[0]))
                System.out.println(args[0] + " is balanced");
            else
                System.out.println(args[0] + " is not balanced");
        }
    }
}