Петли и стопки, домашнее задание палиндрома - PullRequest
4 голосов
/ 25 января 2012

Я работаю над заданием для своего класса программирования, но столкнулся с некоторыми трудностями и не уверен, где еще искать.В основном вопрос состоит в том, что мы пишем программу, которая проверяет палиндромы.

  • Пользователь вводит текст (не допускается использование буквенно-цифровых символов).
  • Строка вставляется одним символомвремя в стеке
  • Символы вытягиваются по одному за раз из стека, таким образом, изменяя строку на
  • Если оригинал такой же, как и на оборотной стороне, у нас есть палиндром

Хотя у меня возникли проблемы с циклами, и я не знаю, куда идти отсюда, у кого-нибудь есть советы или указатели?Что я делаю не так?

Вот что у меня есть.

import java.util.Stack;
import java.util.regex.*;
import javax.swing.*;

public class Question1 {

    static Stack PDrome = new Stack();

    public static String Reverse (String input) {
        String reverse;

        if (input.length() <= 1) {
            return input;
        }   

        //pushing onto the stack
        for (int i=0; i<input.length();i++) {
            PDrome.push(input.charAt(i));
        }


        //popping from the stack into the string
        for (int i=0; i<input.length(); i++) {  
            PDrome.pop()=reverse.charAt(i);
        }  

        return reverse;
    }

    //Illegal char check method
    public static boolean checker (String input) {
        Pattern p = Pattern.compile("[^a-z0-9]", Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(input);
        boolean b = m.find();

        if (b) {
            System.out.println("There is a special character in your string");   
            System.exit(0);
        }   

        return b;    
    }


    //Main
    public static void main (String [] args) {
        //input
        String input = JOptionPane.showInputDialog("Enter text to check if it's a palndrome");

        //error case
        if (input==null); {
            System.out.println("Nothing Entered");
            System.exit(0);
        }

        //checking for illegal chars
        checker(input);
    }
}

Ответы [ 4 ]

3 голосов
/ 25 января 2012

Эта часть:

String reverse;
...
//popping from the stack into the string
for (int i=0; i<input.length(); i++)
{   
    PDrome.pop()=reverse.charAt(i);
}  

должно быть так:

String reverse = "";
...
//popping from the stack into the string
for (int i=0; i<input.length(); i++)
{   
    // appends the popped character to reverse
    reverse += PDrome.pop();
}  

обратите внимание, что при добавлении большого количества строк это не лучший способ сделать это, поскольку строка Java является неизменной, и для повторного добавления строки потребуется каждый раз создавать новую строку. Эта проблема достаточно мала, поэтому она не будет иметь большого значения, но когда проблема станет большой, вы захотите использовать StringBuffer / StringBuilder.

2 голосов
/ 25 января 2012

Что вы на самом деле здесь делаете?

PDrome.pop()=reverse.charAt(i);

Вы должны использовать PDrome.pop() для получения одного char за один раз и добавить его к reverse.

2 голосов
/ 25 января 2012

PDrome.pop()=reverse.charAt(i); неверно.

  1. обратное значение равно нулю -> NullPointerException
  2. Вы присваиваете значение функции? (Поп ())

Вы должны построить , чтобы не всплывать из стека.

Итак, вы должны начать с пустой строки: reverse = ""; и добавить символы, взятые из стека:

while (!PDrome.isEmpty())
   reverse += PDrome.pop();

Название детализации

Пожалуйста, используйте не заглавные буквы, чтобы начать поля и имена методов:

"someIntegerVariable"
"methodForCalculation"

и только заглавные буквы для начала имен классов и интерфейсов:

Stack
ArrayList
MyClass

:)

(из соглашений Java)

1 голос
/ 25 января 2012

Это намного более чистый способ написать это, по моему мнению. Это рекурсивный подход.

bool isPalindrome(String s)
{
    if(s.length() <= 1)
        return true;

    return s[0] == s[s.length() - 1] && isPalindrome(s.substr(1, s.length() - 2);
}

Это НАМНОГО короче, как вы можете видеть.

...