如何解析Java中的括号?

时间:2016-02-11 20:00:28

标签: java parsing stack brackets

我需要编写这样的表达式: 1 + 2)* 3 - 4)* 5 - 6))),然后输出String结果,如下所示( (1 + 2)*((3 - 4)*(5 - 6)))

对不起我的英语,这不是我的母语。

我在这个问题上使用了堆栈。我知道如何检查表达式的正确性:

public boolean isParse(String str)
{
    Stack<Character> s = new Stack<Character>();
    for(int i = 0; i < str.length(); i++)
    {
        char c = str.charAt(i);

        if(c == '{')
            s.push(c);
        else if(c == '[')
            s.push(c);
        else if(c == '(')
            s.push(c);
        else if(c == '}')
        {   if(s.isEmpty())
                return false;
            else if(s.pop() == '{')
            {

            }
            else
                return false;
        }
        else if(c == ']')
        {
            if(s.isEmpty())
                return false;
            else if(s.pop() == '[')
            {

            }
            else
                return false;
        }
        else if(c == ')')
        {
            if(s.isEmpty())
                return false;
            else if(s.pop() == '(')
            {

            }
            else
                return false;
        }
    }

    return s.isEmpty();
}

但我不知道如何修复这个表达式,如上例所示

1 个答案:

答案 0 :(得分:0)

试试这个

static String complementLeftParen(String s) {
    Deque<String> stack = new ArrayDeque<>();
    for (int i = 0; i < s.length(); ++i) {
        char ch = s.charAt(i);
        switch (ch) {
            case '0': case '1': case '2': case '3': case '4':
            case '5': case '6': case '7': case '8': case '9':
                if (!stack.isEmpty() && Character.isDigit(stack.peek().charAt(0)))
                    stack.push(stack.pop() + ch);
                else 
                    stack.push(Character.toString(ch));
                break;
            case '+': case '-': case '*': case '/':
                stack.push(Character.toString(ch));
                break;
            case ')':
                String right = stack.pop();
                String operator = stack.pop();
                String left = stack.pop();
                stack.push(String.format("( %s %s %s )", left, operator, right));
                break;
            case ' ': case '\t':
                break;
            default:
                throw new IllegalArgumentException("unknown char: " + ch);
        }
    }
    if (stack.size() != 1)
        throw new IllegalArgumentException("invalid input: " + s);
    return stack.pop();
}

示例结果

String s ="1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )";
System.out.println(complementLeftParen(s));
// -> ( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )