Здесь мой код для сопоставления скобок. Проблема заключается в том, что он всегда возвращает 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());
}
}
Он всегда возвращает false из-за этой строки:
if (String.valueOf(match_Stack.topAndpop()).equals(String.valueOf(array_match[i]))){
Массив, который вы проверяете, это {"{","{","}","}"}
. Программа работает как для {
s, но когда вы сталкиваетесь с первым }
, match_Stack.topAndpop()
возвращает "}"
и поэтому мы проверяем,
"{".equals("}")
Это неверно.
Чтобы исправить это, вам нужно проверить, соответствует ли закрывающая скобка первому. Вот несколько способов сделать это:
'}' - 2
и ']' - 2
являются соответствующими открывающими скобками, но ')' - 1
является открывающей скобкой из-за ASCII. Это может быть одна возможность для проверки равенства.Map
и сопоставить закрывающие скобки с открывающимися, а затем посмотреть, является ли yourmapname.get(array_match[i])
верхним элементом стека. Кроме того, есть ли причина, по которой вы используете ArrayStack
вместо Stack
? Кроме того, есть ли причина, почему вы используете массив строк вместо String
или char[]
? Также обратите внимание, что вы можете сделать это без стека, посчитав открывающие скобки, вычитая на закрывающие и отслеживая последний тип открывающего кронштейна, чтобы вы могли убедиться, что нет совпадающих скобок (например, ([)]
)
"{".equals("}")
ложь
{
же, как }
? String#equals
возвращает true тогда и только тогда, когда две строки в точности равны. "abc".equals("ABC")
является ложным. Но "{".equals("{")
верно, потому что символ тот же. "{".equals("}")
ложно, потому что символ другой; они указывают в противоположных направлениях.
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());
}
}
Это условие неверно:
String.valueOf(match_Stack.topAndpop()).equals(String.valueOf(array_match[i]))
Вы проверяете, соответствует ли закрывающая скобка открывающей скобке (которая, очевидно, не будет истина - "{".equals("}") == false
), а не проверяет, совпадают ли эти два - я оставлю это вы должны выяснить, как это сделать.
String.equals()
... правильно?println
в ваш код и / или отладьте его. Знание того, как находить ошибки в вашем коде, является одной из первых вещей, которую вы должны изучить.