Сравнивая стека Pop и очереди запросов в Java (палиндромы)
Полное раскрытие: это для задания, поэтому, пожалуйста, не публикуйте фактические решения кода!
У меня есть задание, которое требует, чтобы я взял строку от пользователя и передал ее в стек и очередь, а затем использовал эти два для сравнения символов, чтобы определить, является ли строка палиндромом. У меня есть написанная программа, но, похоже, где-то есть какая-то логическая ошибка. Вот соответствующий код:public static void main(String[] args) {
UserInterface ui = new UserInterface();
Stack stack = new Stack();
Queue queue = new Queue();
String cleaned = new String();
boolean palindrome = true;
ui.setString("Please give me a palindrome.");
cleaned = ui.cleanString(ui.getString());
for (int i = 0; i < cleaned.length(); ++i) {
stack.push(cleaned.charAt(i));
queue.enqueue(cleaned.charAt(i));
}
while (!stack.isEmpty() && !queue.isEmpty()) {
if (stack.pop() != queue.dequeue()) {
palindrome = false;
}
}
if (palindrome) {
System.out.printf("%s is a palindrome!", ui.getString());
} else
System.out.printf("%s is not a palindrome :(", ui.getString());
stack.dump();
queue.clear();
}
public class Stack {
public void push(char c) {
c = Character.toUpperCase(c);
Node oldNode = header;
header = new Node();
header.setData(c);
header.setNext(oldNode);
}
public char pop() {
Node temp = new Node();
char data;
if (isEmpty()) {
System.out.printf("Stack Underflow (pop)n");
System.exit(0);
}
temp = header;
data = temp.getData();
header = header.getNext();
return data;
}
}
public class Queue {
public void enqueue(char c) {
c = Character.toUpperCase(c);
Node n = last;
last = new Node();
last.setData(c);
last.setNext(null);
if (isEmpty()) {
first = last;
} else n.setNext(last);
}
public char dequeue() {
char data;
data = first.getData();
first = first.getNext();
return data;
}
}
public String cleanString(String s) {
return s.replaceAll("[^A-Za-z0-9]", "");
}
В основном, при запуске моего кода через отладчик в Eclipse, моя попа и методы извлечения появляются только выбрать определенные буквы или цифры. Я использую replaceAll("[^A-Za-z0-9]", "")
, чтобы "очистить" строку пользователя от любых неалфанумных символов (!, ?, &, прием.). Когда я говорю, что он выбирает только определенные символы, кажется, что нет никакой модели, которую я могу различить. Есть идеи?
2 ответа:
Ваш общий алгоритм работает правильно, предполагая, что ваша очередь и стек корректны (я попробовал это, используя реализации Deque, найденные в jdk). Поскольку ваше задание включает в себя структуры данных, я в значительной степени просто взял вашу основную логику и заменил структуры данных ArrayDequeue, поэтому я не чувствую, что отвечаю за вас.
String word = "ooffoo"; word = word.replaceAll("[^A-Za-z0-9]", ""); Deque<Character> stack = new ArrayDeque<Character>(word.length()); Deque<Character> queue = new ArrayDeque<Character>(word.length()); for (char c : word.toCharArray()) { stack.push(c); queue.add(c); } boolean pal = true; while (! stack.isEmpty() && pal == true) { if (! stack.pop().equals(queue.remove())) { pal = false; } } System.out.println(pal);
Я бы рекомендовал использовать отладчик, чтобы точно увидеть, что сравнивается, или, по крайней мере, выплюнуть несколько строк печати:
while (!stack.isEmpty() && !queue.isEmpty()) { Character sc = stack.pop(); Character qc = queue.dequeue(); System.out.println(sc + ":" + qc); if (sc != qc) { palindrome = false; } }