在这里,我试图通过使用堆栈和队列来确定一个单词或短语是否为回文,这取决于我所写的短语。
它所做的是,它说所有的东西都是回文,并根据它有多少个字母来写“回文”。
我猜我需要在最后一个for循环和while循环之间添加一些东西,但我不确定是什么。
public class CheckPalindrome {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String line = reader.readLine();
if (line.toLowerCase().equals("quit")) {
break;
}
Stack<Character> stack = new Stack<Character>();
Queue<Character> queue = new LinkedList<Character>();
for (int i = 0; i < line.length(); i++) {
stack.push(line.charAt(i));
}
for (int i = line.length() - 1; i >= 0; i--) {
queue.add(line.charAt(i));
}
while (!queue.isEmpty()) {
if (queue.remove().equals(stack.pop())) {
System.out.println("Palindrome");
} else {
System.out.println("Not a Palindrome");
}
}
}
}
}
发布于 2016-11-07 06:17:16
我对您的代码做了一些非常小的修改(首先修复了一个for循环,然后防止您的“回文/不是回文”消息为输入中的每个字符打印一次),以使其正常工作:
import java.util.Stack;
import java.util.LinkedList;
import java.util.Queue;
import java.io.*;
class Palindrome {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String line = reader.readLine();
if (line.toLowerCase().equals("quit")) {
break;
}
Stack<Character> stack = new Stack<Character>();
Queue<Character> queue = new LinkedList<Character>();
for (int i = 0; i < line.length(); i++) {
stack.push(line.charAt(i));
}
for (int i = 0; i < line.length(); i++) {
queue.add(line.charAt(i));
}
boolean isPalindrome=true;
while (!queue.isEmpty()) {
if (queue.remove().equals(stack.pop())) {
continue;
} else {
isPalindrome=false;
break;
}
}
if (!isPalindrome) {
System.out.println("Not a Palindrome");
} else {
System.out.println("Palindrome");
}
}
}
}
发布于 2016-11-07 06:06:57
您需要按相同的顺序将字符放入每个堆栈和队列中。两者都使用的要点是,一个颠倒了顺序,另一个不颠倒,你自己颠倒其中一个的顺序,就像你现在做的那样,就会否定这一点。
发布于 2016-11-07 06:35:14
如果感兴趣,这里是您使用Deque
的方法的一个变体,而不是分别使用堆栈和队列。队列只是一个双端队列(即同时作为两个队列进行操作)。
public static boolean isPalindrome(String word) {
boolean isPalindrome = word.length() == 1;
if (!isPalindrome) {
Deque<Character> wordDeque = new LinkedList<>();
for (Character c : word.toCharArray()) {
wordDeque.add(Character.toLowerCase(c));
}
isPalindrome = true;
while (isPalindrome && wordDeque.size() > 1) {
isPalindrome = wordDeque.pollFirst().compareTo(wordDeque.pollLast()) == 0;
}
}
return isPalindrome;
}
https://stackoverflow.com/questions/40455042
复制相似问题