Сравнивая стека 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 4

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;
    }
}