使用三个堆栈的回文 - 仅"is a palindrome"输出(java逻辑错误)



我一直在查看每一篇带有回文的帖子,但我没有遇到任何与我遇到的问题相同的问题。。。

我的目标是使用三个堆栈来识别回文——当"夫人;则输出应该是"0";夫人是一个回文"并且当";橙色";则输出应该是"0";橙色不是回文;。我只能得到";。。。是回文";输出,无论是什么

我正在尝试遵循以下算法:

  1. 将每个字符推入原始堆栈和临时堆栈
  2. 将每个字符从临时堆栈中弹出,并将字符推入新堆栈(颠倒顺序(
  3. 将原始堆栈与反向堆栈进行比较

这背后的思想过程是,每当原始堆栈中的一个字符与反向堆栈不匹配时,变量mismatches就会递增,如果不匹配超过零,则输入的单词就是回文

这是代码:

import java.util.Scanner;
import java.util.Stack;
public class Palindrome {
public static boolean is_palindrome(String input) {

Stack<Character> original = new Stack<Character>();
Stack<Character> reversedStack = new Stack<Character>();
Stack<Character> tempStack = new Stack<Character>();

Character letter;           //one character from the input string
int mismatches = 0;         //number of spots that mismatched
int index;                  //index for the input string

for(index = 0; index < input.length(); index++) {

letter = input.charAt(index);

if(Character.isLetter(letter)) {

original.push(letter);
tempStack.push(letter);

}

reversedStack.push(tempStack.pop());

}

while(!original.isEmpty()) {

if(!original.pop().equals(reversedStack.pop())) { mismatches++; }

}
return (mismatches == 0);

}

//main() method, used for testing program
@SuppressWarnings("resource")
public static void main(String[] args) {

Scanner input = new Scanner(System.in);         //user input
String word;                                    //one input line

do {

System.out.print("Enter a word: ");
word = input.nextLine();

if(is_palindrome(word)) { System.out.println(word + " is a palindrome."); }
else { System.out.println(word + " is not a palindrome."); }

break;

} while(word.length() != 0);
}
}

关于为什么这只是打印";。。。是回文吗;?

让我们假设输入都是字母。然后,您的初始for循环将:

  1. 将字母推到original
  2. 将字母推到tempStack
  3. 弹出tempStack,然后将其推到reversedStack

换句话说,这只是一种愚蠢的做法:

  1. 将字母推到original
  2. 将信件推送到reversedStack
  3. tempStack保持为空

显然不是你想要的。您需要一个新的、独立的while循环来实现"pop-tempStack并推入reversedStack"功能。

注意:顺便说一句,这是一个疯狂而复杂的算法,但据推测,任务是学习堆栈,并通过做Rube Goldberg机器工作来做到这一点。如果这不是重点,这可以通过简单地循环一次来完成,从0到输入长度的一半,并将索引i处的char与索引len-i处的char进行比较。整个方法可以放在4行中,并且需要零个对象来完成任务。

您不需要三个堆栈。它可以使用单个堆栈来解决。

  1. 将每个字符推送到Stack
  2. 将弹出的字符与字符串开头的字符进行比较。一旦发现不匹配,立即返回false;否则,如果所有字符匹配,则返回true

演示:

import java.util.Stack;
public class Main {
public static void main(String[] args) {
// Test
System.out.println(isPallindrome("madam"));
System.out.println(isPallindrome("orange"));
}
static boolean isPallindrome(String s) {
Stack<Character> stack = new Stack<>();
char[] arr = s.toCharArray();
for (char c : arr) {
stack.push(c);
}
for (char c : arr) {
if (c != stack.pop()) {
return false;
}
}
return true;
}
}

输出:

true
false

然而,如果你可以自由使用任何其他方法来解决它,下面给出的是一个更简单的方法:

public class Main {
public static void main(String[] args) {
// Test
System.out.println(isPallindrome("madam"));
System.out.println(isPallindrome("orange"));
}
static boolean isPallindrome(String str) {
return new StringBuilder(str).reverse().toString().equals(str);
}
}

输出:

true
false

这是一种极其复杂的方法!你可以在一个for循环中决定一个单词是否是回文的(你只需要遍历一半的单词(-比较索引i和索引长度-i的字符,遍历Math.floor(wordLength/2(字符,如果你有一个不匹配,那就不是回文的-中断循环并打印失败。。。

相关内容

最新更新