Почему моя программа не обнаруживает палиндромы? - PullRequest
0 голосов
/ 19 апреля 2011

Моим заданием было использовать основанную на ссылках реализацию списка ADT и реализацию стека ADT на основе массива в программе, в которой пользователь вводит строку строчных букв. Я должен был пройти строку и сохранить каждую букву в списке и в стеке, а затем использовать стек и содержимое списка, чтобы определить, является ли строка палиндромом или нет. Я должен показать исходную последовательность букв, последовательность букв в обратном порядке и, наконец, утверждение, является ли это палиндромом или нет. Почему-то при вводе палиндрома, напр. мадамимадам, это выводит, что это не палиндром. Я не могу понять, почему, пожалуйста, помогите! Вот мой код для метода:

import javax.swing.JOptionPane;

public class PalindromeTester
{    
    public static void main (String [] args)
    {    
        Character ch;
        boolean isPalindrome = true;
        LinkedList myList = new LinkedList();
        StackArrayBased myStack = new StackArrayBased();
        String response = JOptionPane.showInputDialog ("Please enter a string of lower-case letters" ) ;

        for ( int i = 0 ; i < response.length ( ) ; i++ )
        {
            ch = new Character ( response.charAt ( i ) ) ;
            myStack.push ( ch ) ;
            myList.add ( i + 1 , ch ) ;
        }

        System.out.println ( "The original sequence of characters is: " + response ) ;
        System.out.print ( "The sequence of letters backwards is: " ) ;

        int j = 1 ;
        while ( ! myStack.isEmpty ( ) )
        {
            System.out.print ( myStack.peek ( ) ) ;
            if ( ! myList.get ( j ).equals( myStack.pop (  ) ) ) ;
            isPalindrome = false ;
        }

        if ( isPalindrome )
            System.out.println ( "\nThe string is a palindrome." ) ;
        else
            System.out.println ( "\nThe string is not a palindrome." ) ;
    }
}

Вот класс ADT Stack:

public class StackArrayBased
{
    private static final int MAX_STACK = 15 ;
    private Object items [ ] ;
    private int top ;    

    public StackArrayBased ( )
    {
        items = new Object [ MAX_STACK ] ;
        top = -1 ;
    }

    public boolean isEmpty ( )
    {
        return top < 0 ;
    } 

    public boolean isFull ( )
    {
        return top == MAX_STACK - 1 ;
    }

    public void push ( Object newItem ) throws StackException
    {
        if ( ! isFull ( ) )
            items [ ++ top ] = newItem ;
        else
            throw new StackException ( "StackException on push: stack is full" ) ;
    }

    public void popAll ( )
    {
        items = new Object [ MAX_STACK ] ;
        top = -1 ;
    }

    public Object pop ( ) throws StackException
    {
        if ( ! isEmpty ( ) )
            return items [ top -- ] ;
        else
            throw new StackException ( "StackException on pop: stack is empty" ) ;
    }

    public Object peek ( ) throws StackException
    {
        if ( ! isEmpty ( ) )
            return items [ top ] ;
        else
            throw new StackException ( "StackException on peek: stack is empty" ) ;
    }
}

и вот список ADT:

public class LinkedList
{
    private Node head;
    private int numItems;    

    public LinkedList ( )
    {
        head = null ;
        numItems = 0 ;
    }

    public boolean isEmpty ( )
    {
        return numItems == 0 ;
    }

    public int size ( )
    {
        return numItems ;
    }

    private Node find ( int position )
    {
        Node curr = head ;
        for ( int i = 1 ; i < position ; i ++ )
            curr = curr.getNext ( ) ;

        return curr ;
    }

    public Object get ( int position )
    {
        if ( position >= 0 && position <= numItems )
        {
            Node curr = find ( position ) ;
            Object dataItem = curr.getItem ( ) ;
            return dataItem ;
        }
        else
        {
            System.out.println ( "Error in position value during get attempt." ) ;
            return null ;
        }
    }

    public void add ( int position, Object item )
    {
        if ( position >= 1 && position <= numItems + 1 )
        {
            if ( position == 1 )
            {
                Node newNode = new Node ( item, head ) ;
                head = newNode ;
            }
            else
            {
                Node prev = find ( position - 1 ) ;
                Node newNode = new Node ( item, prev.getNext ( ) ) ;
                prev.setNext ( newNode ) ;
            }

            numItems ++ ;
        }
        else
            System.out.println ( "Position is invalid on attempted add." ) ;
    }

    public void remove ( int position )
    {
        if ( position >= 1 && position <= numItems )
        {
            if ( position == 1 )
                head = head.getNext ( ) ;
            else
            {
                Node prev = find ( position - 1 ) ;
                Node curr = prev.getNext ( ) ;
                prev.setNext ( curr.getNext ( ) ) ;
            }

            numItems -- ;
        }
        else
            System.out.println ( "Position is invalid on attempted remove." ) ;
    }

    public void removeAll ( )
    {
        head = null ;
        numItems = 0 ;
    }
}

Ответы [ 3 ]

0 голосов
/ 19 апреля 2011

Во втором цикле вы должны увеличивать j.Поскольку индекс связанного списка может быть 0, вы не должны делать индекс i + 1 при добавлении (в первом цикле).Если вы сделаете его индексом на основе 0, вы должны инициализировать j, чтобы он был 0 до второго цикла.

0 голосов
/ 19 апреля 2011

Задание кажется странным; если вы можете получить доступ к последнему элементу списка (как позволяет абстрактный список в большинстве языков), тогда вы можете просто сделать for i=[0,length) {if input[i]!=input[length-1-i], return false} return true

И если у вас есть только стеки, с которыми можно играть, вы можете просто клонировать и перевернуть стек (например, вытолкнув на два стека и поместив один из них в новый стек, перевернув его), и сделать то же самое, что и цикл for (последовательно просматривайте два стека, чтобы увидеть, совпадают ли они).

В обоих приведенных выше алгоритмах с линейным временем (либо с использованием только списков, либо с использованием только стеков) функция должна состоять из трех строк или около того.

0 голосов
/ 19 апреля 2011

Если вы хотите правильно установить isPalindrome, разве вы не должны что-то делать с j в этом цикле ...?:

[...]
int j = 1 ;
while ( ! myStack.isEmpty ( ) )
{
  System.out.print ( myStack.peek ( ) ) ;
  if ( ! myList.get ( j ).equals( myStack.pop (  ) ) ) ;
        isPalindrome = false ;
}
[...]
...