【问题标题】:How to parse the brackets in Java?如何解析Java中的括号?
【发布时间】:2016-02-11 20:00:28
【问题描述】:

我需要编写这样的方法:1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) ),然后输出这样的字符串结果( ( 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();
}

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

【问题讨论】:

  • 是否有从输入中导出结果的规则?
  • 到目前为止你到底尝试了什么?
  • @JasonZ m 也是第一个想到的。那是一棵树。
  • 如果你说你使用了Stack,那么显示你的一些代码。
  • 那么,您希望解析一个损坏的表达式并修复它?具体如何?该修复程序可能有许多与您提供的不同的解决方案...(例如((1+2) * ((3 - 4) * (5-6)))

标签: java parsing stack brackets


【解决方案1】:

试试这个

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 ) ) )

【讨论】:

  • 非常感谢!根据我的需要,该方法可以正常工作。 :)
  • @komax93 不要只是说谢谢。接受答案并投票。
猜你喜欢
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多