这是我的匹配括号的代码。问题是它总是返回false 我无法看出错误在哪里 topAndpop()返回堆栈的顶部值及其Object类型 有人可以告诉我这个错误。
public class Matching {
ArrayStack match_Stack=new ArrayStack();
Object popped;
String[] array_match={"{","{","}","}"};
public boolean matching() throws OverFlowException,EmptyStackException {
boolean isMatch=false;
for(int i=0;i< array_match.length;i++) {
if (array_match[i].equals("{") || array_match[i].equals("[") ||array_match[i].equals("("))
match_Stack.push(array_match[i]);
if(array_match[i].equals("}") || array_match[i].equals("]") ||array_match[i].equals(")") ) {
if (match_Stack.isEmpty())
return false;
if (String.valueOf(match_Stack.topAndpop()).equals(String.valueOf(array_match[i]))) {
isMatch=true;
} else {
isMatch=false;
return isMatch;
}
}
}
return isMatch;
}
public static void main (String args[]) throws EmptyStackException,OverFlowException {
Matching a=new Matching();
System.out.println(a.matching());
}
}
答案 0 :(得分:1)
由于这一行,它总是返回false:
if (String.valueOf(match_Stack.topAndpop()).equals(String.valueOf(array_match[i]))){
您正在检查的数组是{"{","{","}","}"}
。该程序适用于{
,但当您遇到第一个}
时,match_Stack.topAndpop()
会返回"}"
,因此我们会检查是否
"{".equals("}")
哪个是假的。
要解决此问题,您需要检查右括号是否与开头括号匹配。以下是一些方法:
'}' - 2
和']' - 2
是相应的左括号,但由于ASCII,')' - 1
是左括号。这可能是检查平等的一种可能性。Map
并将结束括号映射到开头的括号,然后查看yourmapname.get(array_match[i])
是否是堆栈的顶部元素。此外,您使用ArrayStack
代替Stack
是否有任何理由?另外,您是否有理由使用字符串数组而不是String
或char[]
?另外,请注意,您可以通过计算左括号,减去关闭的括号,并跟踪最后一种类型的左括号来执行此操作,以便您可以确保没有重叠的括号(如([)]
)< / p>
答案 1 :(得分:0)
这种情况是错误的:
String.valueOf(match_Stack.topAndpop()).equals(String.valueOf(array_match[i]))
您正在检查结束括号是否等于左括号(显然不会是真的 - "{".equals("}") == false
),而不是检查两个是否匹配 - 我会留给你弄清楚如何做到这一点。
答案 2 :(得分:0)
Stack
时,我不确定你为什么要使用Apache的Stack类。这是重写此内容的一种可能方法。
import java.util.*;
public class Matching{
Stack<String> match_Stack=new Stack<String>();
Object popped;
String[] array_match={"{","{","}","}"};
Map<String, String> opposites;
public boolean matching() {
// create the mapping
opposites = new HashMap<String,String>();
opposites.put("{", "}");
opposites.put("[", "]");
opposites.put("(", ")");
for(int i=0;i< array_match.length;i++){
String s = array_match[i];
if (s.equals("{") || s.equals("[") ||s.equals("("))
match_Stack.push(opposites.get(s));
else if (s.equals("}") || s.equals("]") || s.equals(")")) {
if (match_Stack.isEmpty() || !match_Stack.pop().equals(s))
return false;
}
}
return match_Stack.empty();
}
public static void main (String args[]) {
Matching a=new Matching();
System.out.println(a.matching());
}
}
使用char
代替String
,这是另一种可以说更直观的实现。
import java.util.*;
public class MatchingChar{
Stack<Character> match_Stack = new Stack<Character>();
Object popped;
String input = "{{}}";
Map<String, String> opposites;
public boolean matching() {
opposites = new HashMap<,String>();
opposites.put('{', '}');
opposites.put('[', ']');
opposites.put('(', ')');
for(int i=0;i< input.length();i++){
char s = input.charAt(i);
if (s == '{' || s == '[' ||s == '(')
match_Stack.push(opposites.get(s));
else if (s == '}' || s == ']' || s == ')') {
if (match_Stack.isEmpty() || !match_Stack.pop() == s)
return false;
}
}
// If the stack here, that means all grouping operators were matched correctly
return match_Stack.empty();
}
public static void main (String args[]) {
Matching a= new Matching();
System.out.println(a.matching());
}
}