我一直在查看每一篇带有回文的帖子,但我没有遇到任何与我遇到的问题相同的问题。。。
我的目标是使用三个堆栈来识别回文——当"夫人;则输出应该是"0";夫人是一个回文"并且当";橙色";则输出应该是"0";橙色不是回文;。我只能得到";。。。是回文";输出,无论是什么
我正在尝试遵循以下算法:
- 将每个字符推入原始堆栈和临时堆栈
- 将每个字符从临时堆栈中弹出,并将字符推入新堆栈(颠倒顺序(
- 将原始堆栈与反向堆栈进行比较
这背后的思想过程是,每当原始堆栈中的一个字符与反向堆栈不匹配时,变量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循环将:
- 将字母推到
original
上 - 将字母推到
tempStack
上 - 弹出
tempStack
,然后将其推到reversedStack
上
换句话说,这只是一种愚蠢的做法:
- 将字母推到
original
上 - 将信件推送到
reversedStack
tempStack
保持为空
显然不是你想要的。您需要一个新的、独立的while循环来实现"pop-tempStack并推入reversedStack"功能。
注意:顺便说一句,这是一个疯狂而复杂的算法,但据推测,任务是学习堆栈,并通过做Rube Goldberg机器工作来做到这一点。如果这不是重点,这可以通过简单地循环一次来完成,从0到输入长度的一半,并将索引i处的char与索引len-i处的char进行比较。整个方法可以放在4行中,并且需要零个对象来完成任务。
您不需要三个堆栈。它可以使用单个堆栈来解决。
- 将每个字符推送到
Stack
- 将弹出的字符与字符串开头的字符进行比较。一旦发现不匹配,立即返回
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(字符,如果你有一个不匹配,那就不是回文的-中断循环并打印失败。。。