【问题标题】:Checking a string is palindromic using stacks使用堆栈检查字符串是回文
【发布时间】:2019-05-25 11:52:06
【问题描述】:

我想使用 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();
}

很明显,“级别”这个词是回文,但它总是说“输入字符串不是回文”。

【问题讨论】:

  • 您的代码不完整——缺少 Stack 实现。请提供显示您的问题的最少代码:stackoverflow.com/help/minimal-reproducible-example
  • 我会创建一个单独的类来接收构造函数中的输入字符串。该类应该有一个名为IsPalindromic() 的方法,它返回真/假。在这个类中,您将使用您的 Stack 类。这个类可以在内部有一个Reversed() 函数,它简单地将所有字母压入内部堆栈,然后返回一个新字符串,当您将它们弹出时将它们连接起来。然后IsPalindromic() 可以将传入的原始字符串与反转的字符串进行比较。

标签: java data-structures stack


【解决方案1】:

您的解决方案至少存在两个基本问题:

  1. 您弹出 s1 直到它为空,然后进行回文检查
  2. s1和reverser不是同一个数据类型

1) 暂时忽略项目符号 2,当您使用它来确定输入是否为回文时,看起来 s1 为空。您需要确保在进行等价检查时,两个变量都指向其中包含数据的结构!

2) s1 是一个堆栈,反向器是一个字符串[]。 Stack 中 'equals' 的默认实现是检查参数是否是 Stack 的实例。由于永远不会出现这种情况,因此您将始终看到“输入字符串不是回文。”。

要修复 2),您需要使两个对象具有相同的数据类型(Stack 或 String[])。如果选择后者 String[],则需要验证每个索引 i 处的字符串在 s1 和 reverser 中是否相等。

希望这会有所帮助!

【讨论】:

  • 非常感谢您的评论。但是当谈到 2) 我创建了变量类型为 String 的堆栈,它以数组的形式实现。这就是为什么我也使用数组数据结构创建了字符串反向器。你能建议我一个检查两个数组元素的函数吗?
  • @Manodhya 啊,我明白了。如果您的 stackArray 和 reverser 都是 String[] 类型,并且 reverser 确实是 st​​ackArray 的反向,那么您应该能够简单地调用 Arrays.equals(stackArray, reverser)。
  • @Manodhya 如果这样做了,你介意正式接受答案吗?谢谢!
【解决方案2】:

检查堆栈类中equals方法的实现,因为没有发布实现很难找到问题。但是,如果您不需要这样做,您可以使用相同的方法进行比较。请记住使用相同的数据类型。例如,将数组和堆栈转换为字符串。然后使用字符串类的equals方法。

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

【讨论】:

  • 非常感谢您的回答但我认为我做了与您手动操作相同的操作。我将“级别”的字符推送到变量类型为字符串的堆栈中,并以数组的形式实现,并将这些值弹出到另一个字符串数组(字符串反向器)。如果我错了,请纠正我
  • @ManodhyaOpallage,在您的 if 语句“s1.equals(reverser)”中,“s1”类型是堆栈,“reverser”是一个字符串 []。在该比较中,每个 equals 方法都应返回 false。我的帖子的想法是表明您可以在代码中从 String 数组(reverser 和 stackArray)中形成 2 个字符串,并使用它们进行比较,而无需使用 Stack 类中的 equals 方法。
  • 我明白了。非常感谢你,还有更多优点:)
【解决方案3】:

在两年没有使用 Java 之后,我正在重新学习 Java。这是我之前对您的主要帖子的评论的实现。我的堆栈是基于 OOP 的,而不是使用内部数组:

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

    }

}

【讨论】:

  • 非常感谢您的指导。我理解你还有更多优点:)
【解决方案4】:
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);
}

【讨论】:

  • 你不能使用==比较Java中的字符串(除非你真的知道你在做什么)
  • 谢谢@AlexanderPavlov。如果我使用 equals() 可以吗
  • 是的。不过,我认为没有必要构建反向字符串。您可以返回堆栈,一个一个弹出元素,并将字符与原始字符串进行比较
猜你喜欢
  • 2013-06-18
  • 2021-12-08
  • 2013-07-26
  • 2020-12-19
  • 1970-01-01
  • 2018-02-22
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多