#java #arrays #data-structures #stack
#java #массивы #структуры данных #стек
Вопрос:
Это код для проверки символа баланса. Однако, когда я пытаюсь вписаться в тестер, он неправильно отображает ответ.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class BalanceCheck {
private static Scanner in;
public static void main(String[] args){
if(args.length > 0){
System.out.println(args[0]);
try {
in = new Scanner(new File(args[0]));
MyStack<Character> stack = new MyStack<>();
String str;
char ch;
while(in.hasNext()){
str = in.next();
for(int i = 0; i < str.length(); i){
ch = str.charAt(i);
if(ch == '(' || ch == '[' || ch == '{' ||
(ch == '/' amp;amp; i < str.length() - 1 amp;amp; str.charAt(i 1) == '*')){
stack.push(ch);
}
else if(ch == ')'){
if(stack.isEmpty() || stack.pop() != ch){
System.out.println(") is mismatched");
return;
}
}
else if(ch == ']'){
if(stack.isEmpty() || stack.pop() != ch){
System.out.println("] is mismatched");
return;
}
}
else if(ch == '}'){
if(stack.isEmpty() || stack.pop() != ch){
System.out.println("} is mismatched");
return;
}
}
else if(ch == '*' amp;amp; i < str.length() - 1 amp;amp; str.charAt(i 1) == '/'){
if(stack.isEmpty() || stack.pop() != '/'){
System.out.println("*/ is mismatched");
return;
}
}
else if(ch == '"'){
if(stack.isEmpty() || stack.top() == '"'){
if(!stack.isEmpty())
stack.pop();
}
else{
stack.push(ch);
}
}
}
}
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
else{
System.out.println("Command line argument is not provided..");
}
}
}
Например, если я скомпилирую этот тестер,
/*this tests an unbalanced [ operator*/
public class Test1 {
/* this is the main method */
public static void main(String[ ) args) {
String ghana = "hello";
int test = testing();
}
public int testing() {
/*checking this too */
/* and this */
return 1;
}
}
Он должен показывать [ не соответствует. Но он показывает, что /* не соответствует.
Пожалуйста, дайте мне знать решение.
И я должен создать файл тестера для этого кода выше.
Как я могу закодировать тестер для этого?
Спасибо,
Ответ №1:
Подумайте о том, что происходит с самой первой строкой: /*this tests an unbalanced [ operator*/
Когда вы нажимаете ‘*/’, в верхней части стека появляется ‘[‘.
Вам нужно отслеживать, когда вы находитесь внутри комментария, чтобы вы могли игнорировать все до конца.
Всякий раз, когда у вас возникает подобная проблема, вам необходимо использовать отладчик.