我需要编写这样的表达式: 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();
}
但我不知道如何修复这个表达式,如上例所示
答案 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 ) ) )