Так вот в чем проблема, каждый рекурсивный вызов, который вы делаете:
ArrayStack S = new ArrayStack(100);
, что означает, что при каждом вызове вы создаете совершенно новый стек. Поэтому вы можете захотеть создать новый стек для каждой строки, которую вы читаете из файла, и просто передать этот стек своей функции.
Вот мое решение. Я предполагал, что некоторые фиктивные тестовые строки вместо чтения из файла, это в основном то же самое. Просто для проверки функции.
public class Main {
public static void main(String[] args) {
// test string
String [] tests = {"[][][]{}()", ")(()){([()])}", "((()(()){([()])}", "({[]}){[]}()"};
for (int i =0; i < 4; i++) {
Stack<Character> stack = new Stack<>();
System.out.println(matchBrackets(stack, tests[i], 0));
}
}
private static boolean matchBrackets(Stack<Character> stack, String str, int i) {
// if we reached the end of the string, then check if stack is empty or not
if (i == str.length() && !stack.isEmpty()) return false;
else if (i == str.length() && stack.isEmpty()) return true;
if (str.charAt(i) == '(' || str.charAt(i) == '{' || str.charAt(i) == '['){
stack.push(str.charAt(i));
return matchBrackets(stack,str,++i);
} else {
// if stack is empty, then the expression is false
if (stack.isEmpty()) return false;
char c = stack.pop();
if ( (str.charAt(i) == '}' && c != '{') && (str.charAt(i) == ']' && c != '[') && (str.charAt(i) == ')' && c != '(') ) {
return false;
} else {
return matchBrackets(stack,str,++i);
}
}
}
}
Примечание. Вы можете, например, очистить стек для каждого выражения вместо его повторной инициализации.