У меня возникла проблема с новичком в java (и вообще программированием) с заданием, которое нам было дано. Назначение делится на 3 части, чтобы проверить, имеет ли данная строка сбалансированные скобки.Проверьте, соответствует ли данная строка сбалансированным скобкам строка, рекурсивно
"правила" являются следующие:
"abcdefksdhgs"
- сбалансирован"[{aaa<bb>dd}]<232>"
- сбалансирован"[ff{<gg}]<ttt>"
- не сбалансирован (не закрытия для '<')"{<}>"
- НЕ сбалансирован
1-й части задания было написать метод, который получит массив символов, содержащий строку, и будет найти первый индекс (= массив ячеек), содержащий кронштейн, одно из следующих действий:
} , { , ] , [ , (,) , > , <
это, конечно, было легко сделать:
/**
* bracketIndex - 1st Method:
* this method will get a single string (read from the text file),
* and will find the first index char that is any bracket of the following: },{,],[,(,),>,<
* @param str1 - the given string.
* @return index - the first index that contains character that is one of the brackets listed above.
*/
public static int bracketIndex(String str1){
int index = -1; // default value: didn't find any bracket in the string.
int i = 0;
for(i = 0; i < str1.length(); i++){
if(str1.charAt(i) == '}' || str1.charAt(i) == '{' || str1.charAt(i) == ']' || str1.charAt(i) == '[' || str1.charAt(i) == '(' || str1.charAt(i) == ')' || str1.charAt(i) == '>' || str1.charAt(i) == '<'){
return index = i;
}//if
}//for
return index;
}//end of bracketIndex
2-ая часть была написать метод, который получит два символа, и возвращает истину, только если второй символ является подходящим закрывающая скобка первого гольца (пример: первый = '<' 2nd = '>' = true (напротив false!), 1st = '<' 2nd = 'e' = false). Это также не было неприятностей:
/**
* checkBracket - 2nd Method:
*
* @param firstChar, secondChar - two chars.
* @return True - if the the two chars are brackets, in which the second char is the closing bracket of the first char
*/
public static boolean checkBracket(char firstChar, char secondChar){
if ( (firstChar == '(') && (secondChar == ')') ||
(firstChar == '[') && (secondChar == ']') ||
(firstChar == '{') && (secondChar == '}') ||
(firstChar == '<') && (secondChar == '>') ){
return true;
}//if
return false;
}//end of checkBracket
3-я часть, чтобы написать рекурсивный метод, который получит строку, и возвращает «истинный» тогда и только тогда, когда строка сбалансирована струна скобки. Конечно, мы должны использовать 1-й 2-й & методы, которые мы уже писали, а также нам дали подсказку:
ПОДСКАЗКА: использовать метод помощи, который получит 2 строки
В этой части я» m застрял. Я придумал несколько случаев остановки:
- если нет скобка вообще в данной строке - возвращает истинное
- , если данная строка пуста возвращающие (этот вариант рассматривается в 1-й метод)
- при обнаружении открытого кронштейна, а закрывающая скобка соответствия - возвращает истину
в противном случае, возвращение ложным. в коде записываясь, я в настоящее время застрял и не знаю, как дальше от рекурсивного вызова в строке 26 в моем коде для этого метода:
/**
* checkBalance - 3rd Method:
* will check if a given string is a balanced string.
* @param str1 - the given string to check.
* @return true - if the given string is balanced, false - if the given string isn't balanced.
*/
public static boolean checkBalance(String str1){
boolean ans;
int a = bracketIndex(str1);
if (a == -1){
return ans = true;
}//if
if(str1.charAt(a) == '{' ||
str1.charAt(a) == '[' ||
str1.charAt(a) == '<' ||
str1.charAt(a) == '(' ){
int b = bracketIndex(str1.substring(a))+1 ;
if(b != 0){
if(checkBracket (str1.charAt(a), str1.charAt(b)) == true){
return ans = true;
}//if
if(str1.charAt(b) == '{' ||
str1.charAt(b) == '[' ||
str1.charAt(b) == '<' ||
str1.charAt(b) == '(' ){
checkBalance(str1.substring(b-1));
}//if
else{
return ans = false;
}//else
}//if
}//if
return ans = false;
}//end of checkBalance
Я не знаю, как продолжить работу, если рекурсивный код из строки 26 вернет true.
Я буду рад получить некоторые рекомендации от экспертов здесь, в каком направлении идти, или я делаю все неправильно с самого начала.
Я думаю, что вы не поняли намека. Это говорит о том, что основная функция, которая принимает один аргумент и возвращает логическое значение, не обязательно должна быть рекурсивной, а скорее должна иметь рекурсивную вспомогательную функцию, которая принимает две строки (и возвращает все, что удобно для ее реализации, возможно, целочисленный индекс или другую строку). – Blckknght