Проверка строки палиндромна с использованием стеков - PullRequest
1 голос
/ 25 мая 2019

Я хочу проверить, является ли строка палиндромной, используя стеки, реализованные в Java.Я пробовал много способов, но это не дает мне правильный ответ.Может ли кто-нибудь помочь мне с этим?

В моем классе реализован стек, имя переменной которого - "stackArray".

Палиндромный метод:

Stack s1 = new Stack(5);

for (int i = 0; i < 5; i++) {
    s1.push(stackArray[i]);
}

String [] reverser = new String[5];

while (!s1.isEmpty()) {
    int count = 0;
    reverser[count] = s1.pop();
    count++;
}

if (s1.equals(reverser)){
    System.out.println("The input String is a palindrome.");
}
else
    System.out.println("The input String is not a palindrome.");

Код драйвера:

public static void main(String[] args) throws Exception { 

        Stack st = new Stack(5);

        st.push("l");
        st.push("e");
        st.push("v");
        st.push("e");
        st.push("l");
        System.out.println("");
        System.out.println("When Palindromic is starting; ");
        System.out.println("");
        st.palindromic();
}

Очевидно, что слово «уровень» является палиндромным, но всегда оно говорит: «Строка ввода не являетсяпалиндром. "

Ответы [ 4 ]

0 голосов
/ 26 мая 2019
public static void main(String[] args) { 

    String str ="word";
    if(str.equals(reverse(str))) {
          System.out.println("Word is Palindromic ");
    }else {
          System.out.println("Word is Not Palindromic ");
    }
}


public static String reverse(String str) {
    char[] charArr = str.toCharArray();
    int size = charArr.length;
    Stack stack = new Stack(size);

    int i;
    for(i = 0; i < size; ++i) {
        stack.push(charArr[i]);
    }

    for(i = 0; i < size; ++i) {
        charArr[i] = stack.pop();
    }

    return String.valueOf(charArr);
}
0 голосов
/ 25 мая 2019

Проверьте реализацию метода equals в вашем классе стека, так как реализация не опубликована, трудно найти проблему. Но вместо этого, если вам не нужно это делать, вы можете выполнить сравнение тем же методом. Не забудьте использовать один и тот же тип данных. Например, приведите массив и стек к строке. Затем используйте метод equals класса string.

String original = "level"; //The contents of you stack dumped into a String
String[] reversedArr = {"l", "e", "v", "e", "l"}; //And your array reverser

String reversed = "";

for (String letter : reversedArr)
    reversed = reversed.concat(letter);

System.out.println(original.equals(reversed));
0 голосов
/ 25 мая 2019

Я переучиваю Java после того, как не использую его в течение двух десятилетий. Вот реализация моего предыдущего комментария к вашему основному посту. Мой стек основан на ООП, а не на внутреннем массиве:

public class Palindrome {

    public static void main(String[] args)
    {
        java.util.Scanner keyboard = new java.util.Scanner(System.in);
        System.out.print("Enter the word to check: ");
        String input = keyboard.nextLine();
        Palindrome p = new Palindrome(input);
        System.out.println("Input: " + p.getInput());
        System.out.println("Reversed: " + p.getInputReversed());
        System.out.println("Palindromic: " + p.isPalindromic());
    }

    private String _input;

    public Palindrome(String input)
    {
        _input = input.toLowerCase();
    }

    public String getInput()
    {
        return _input;
    }

    public String getInputReversed()
    {
        CharStack chars = new CharStack(getInput());    
        String reversed = "";
        while(!chars.empty())
        {
            try {
                reversed = reversed + chars.pop();
            } catch (Exception e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
        return reversed;
    }

    public boolean isPalindromic()
    {
        return getInput().equals(getInputReversed());
    }

    private class CharStack
    {

        private CharStackNode top = null;

        private class CharStackNode
        {
            public char c;
            public CharStackNode next = null;

            public CharStackNode(char inC, CharStackNode top)
            {
                c = inC;
                next = top;
            }
        }

        public CharStack(String input)
        {
            for(char c: input.toCharArray())
            {
                push(c);
            }
        }

        public void push(char c)
        {
            top = new CharStackNode(c, top);;
        }

        public char pop() throws Exception
        {
            if (!empty())
            {
                char c = top.c;
                top = top.next;
                return c;
            }
            else
            {
                throw new Exception("Cannot pop() an empty stack!");
            }
        }

        public boolean empty()
        {
            return top == null;
        }

    }

}
0 голосов
/ 25 мая 2019

Есть как минимум две фундаментальные проблемы с вашим решением:

  1. Вы получаете s1 до тех пор, пока он не опустеет, а затем выполняете проверку палиндрома
  2. s1 и reverser не совпадают с типом данных

1) Пока игнорируется пункт 2, похоже, что s1 пуст, когда вы используете его, чтобы определить, является ли ввод палиндромом. Вам необходимо убедиться, что при проверке эквивалентности обе переменные указывают на структуры с данными в них!

2) s1 - это стек, а реверс - это строка []. Реализация по умолчанию 'equals' в стеке - это проверка того, является ли аргумент экземпляром стека. Поскольку этого никогда не произойдет, вы всегда увидите «Входная строка не является палиндромом».

Чтобы исправить 2), вам нужно сделать оба объекта одного типа данных (либо Stack, либо String []). Если вы выберете последнюю строку [], вам нужно будет проверить, что строки в каждом индексе i эквивалентны как в s1, так и в реверсоре.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...