텍스트 파일에서 문자열을 가져오고 스택을 사용하여 문자열을 분석하고 특정 규칙에 적합한 지 여부에 따라 문자열이 속한 "언어"를 결정하는 코드를 작성하고 있습니다. 아래 코드는 입력이 패턴 (A^nB ^)^p (여기서 n은 0보다 크거나 같음)를 따르는 지 여부를 테스트합니다. 필자가 작성한 방법은 A와 B의 첫 번째 세트를 스택에로드 한 다음 두 번째 세트의 A와 B를 다른 스택에로드하고 두 개의 스택을 동시에 팝하고 반환 된 값을 비교하는 것입니다. 일치하는 경우, 두 스택이 동시에 비어있을 때까지 이동하고, 그렇지 않으면 false를 반환합니다.false를 반환해야하는 경우 내 코드가 true를 반환하는 이유는 무엇입니까?
public static boolean checkL4(File file) throws IOException
{
Stack stack1 = new Stack();
Stack stack2 = new Stack();
Stack stack3 = new Stack();
boolean firstCompare = true;
boolean bStart = false;
char w = 0;
try (Scanner sc = new Scanner(file).useDelimiter("\\s*"))
{
while (sc.hasNext()){
w = sc.next().charAt(0);
if (w == 0) {
return true;
}
if (w != 'A' && w != 'B')
{
return false;
}
if (w == 'A') {
if(!bStart) {
stack1.push(w);
stack3.push(w);
}
if(bStart && stack2.isEmpty()) {
stack2.push(w);
} else {
if (firstCompare) {
while (!stack1.isEmpty() || !stack2.isEmpty()) {
if (!stack1.isEmpty() && stack2.isEmpty())
{
return true;
}
if (stack1.isEmpty() && !stack2.isEmpty()) {
return false;
} else {
if (stack1.pop() == stack2.pop()) {
return true;
} else {
return false;
}
}
}
stack1.push(w);
firstCompare = false;
} else {
if(stack1.isEmpty()){
while (!stack3.isEmpty() || !stack2.isEmpty()) {
if (stack3.isEmpty() && !stack2.isEmpty()) {
return false;
} else {
if (stack2.isEmpty() && !stack3.isEmpty()) {
return false;
} else {
if (stack3.pop() == stack2.pop()) {
return true;
} else {
return false;
}
}
}
}
stack1.push(w);
}
if (stack3.isEmpty()){
while (!stack1.isEmpty() || !stack2.isEmpty()) {
if (stack1.isEmpty() && !stack2.isEmpty()) {
return false;
} else {
if (stack2.isEmpty() && !stack1.isEmpty()) {
return false;
} else {
if (stack1.pop() == stack2.pop()) {
return true;
} else {
return false;
}
}
}
}
stack1.push(w);
}
}
}
}
if (w == 'B') {
bStart = true;
if(bStart && stack2.isEmpty()) {
stack2.push(w);
}
if(bStart && !stack2.isEmpty()) {
if (!stack1.isEmpty()) {
stack3.push(w);
}
if(!stack3.isEmpty()) {
stack1.push(w);
}
}
}
}
}
return false;
}
이 코드는 대부분의 입력이 사실 반환 (AB 및 AABBBAABBB true를 반환하고, BBAA에 대한 false를 반환)하지만 어떤 경우에는 곳은 (ABBA 및 AABBCCD 같은) false를 반환해야 제대로 작동합니다. 따라서 회문문 인 경우와 그렇지 않은 경우가있는 이유는 무엇입니까? 나는 w (입력)가 아니고 A가 아니고 B가 아닌 경우 false를 반환한다고하는 진술을 거기에 가지고 있습니다. 이것은 필자가 작성한 유사한 방법들에서 효과가있다. 두 반환 된 값이 일치하지 않으면 false를 반환하기 위해이 메서드를 작성했습니다 (입력이 회귀 식이면 안됩니다).
를 사용하여 두 개의 문자열 사이의 비교, 그래서'스택'에'Stack'을 변경 .isEqual를 사용한다고 생각합니다. –
Andreas