回文使用三个堆栈,仅输出为“是回文”(java逻辑错误)
我一直在看每一篇用回文这个词的帖子,但我没有遇到任何一篇与我遇到的问题相同的帖子
我的目标是使用三个堆栈识别回文-当输入“madam”时,输出应该是“madam是回文”,当输入“orange”时,输出应该是“orange不是回文”。我只能得到“…是回文”输出,不管是什么
我试图遵循以下算法:
- 将每个字符推入原始堆栈和临时堆栈
- 将每个字符从临时堆栈中弹出,并将字符推入新堆栈(颠倒顺序)
- 比较原始堆栈和反向堆栈
这背后的思想过程是,每当原始堆栈中的一个字符与反向堆栈不匹配时,变量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);
}
}
关于为什么这只是打印“…是回文”的任何提示
# 1 楼答案
这是非常复杂的方法!你可以在一个for循环中决定一个单词是否是回文的(你只需要遍历半个单词)——比较索引i和索引长度处的字符——i,进行数学运算。地板(字长/2)字符,如果您有一个不匹配,它不是回文-中断循环和打印失败
# 2 楼答案
让我们假设输入的都是字母。然后,您的初始for循环将:
original
上李>tempStack
上李>tempStack
,并将其推到reversedStack
李>换句话说,这只是一种愚蠢的做法:
original
reversedStack
tempStack
仍为空李>显然不是你想要的。“pop tempStack和push into reversedStack”功能需要一个新的、单独的while循环
注:作为旁注,这是一个非常复杂的算法来完成这项工作,但大概任务是学习堆栈,并通过Rube Goldberg机器工作来完成。如果不是这样的话,只需简单地循环一次,从输入长度的0到一半,并将索引i处的字符与索引len-i处的字符进行比较,就可以完成这项工作。整个方法可以放在4行中,并且只需要0个对象就可以完成这项工作
# 3 楼答案
您不需要三个堆栈。可以使用单个堆栈解决此问题
Stack
李>false
;否则,如果所有字符都匹配,则返回true
李>演示:
输出:
但是,如果您可以自由使用任何其他方法来解决此问题,下面给出的是一种更简单的方法:
输出: