有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

回文使用三个堆栈,仅输出为“是回文”(java逻辑错误)

我一直在看每一篇用回文这个词的帖子,但我没有遇到任何一篇与我遇到的问题相同的帖子

我的目标是使用三个堆栈识别回文-当输入“madam”时,输出应该是“madam是回文”,当输入“orange”时,输出应该是“orange不是回文”。我只能得到“…是回文”输出,不管是什么

我试图遵循以下算法:

  1. 将每个字符推入原始堆栈和临时堆栈
  2. 将每个字符从临时堆栈中弹出,并将字符推入新堆栈(颠倒顺序)
  3. 比较原始堆栈和反向堆栈

这背后的思想过程是,每当原始堆栈中的一个字符与反向堆栈不匹配时,变量mismatches就会递增,如果不匹配超过零,则输入的单词就是回文

代码如下:

import java.util.Scanner;
import java.util.Stack;

public class Palindrome {

    public static boolean is_palindrome(String input) {
        
        Stack<Character> original = new Stack<Character>();
        Stack<Character> reversedStack = new Stack<Character>();
        Stack<Character> tempStack = new Stack<Character>();
        
        Character letter;           //one character from the input string
        int mismatches = 0;         //number of spots that mismatched
        int index;                  //index for the input string
        
        for(index = 0; index < input.length(); index++) {
            
            letter = input.charAt(index);
            
            if(Character.isLetter(letter)) {
                
                original.push(letter);
                tempStack.push(letter);
                
            }
            
            reversedStack.push(tempStack.pop());
            
        }
        
        while(!original.isEmpty()) {
            
            if(!original.pop().equals(reversedStack.pop())) { mismatches++; }
            
        }
        return (mismatches == 0);
        
    }
    
    //main() method, used for testing program
    @SuppressWarnings("resource")
    public static void main(String[] args) {
        
        Scanner input = new Scanner(System.in);         //user input
        String word;                                    //one input line
        
        do {
            
            System.out.print("Enter a word: ");
            word = input.nextLine();
            
            if(is_palindrome(word)) { System.out.println(word + " is a palindrome."); }
            else { System.out.println(word + " is not a palindrome."); }
            
            break;
            
        } while(word.length() != 0);

    }

}

关于为什么这只是打印“…是回文”的任何提示


共 (3) 个答案

  1. # 1 楼答案

    这是非常复杂的方法!你可以在一个for循环中决定一个单词是否是回文的(你只需要遍历半个单词)——比较索引i和索引长度处的字符——i,进行数学运算。地板(字长/2)字符,如果您有一个不匹配,它不是回文-中断循环和打印失败

  2. # 2 楼答案

    让我们假设输入的都是字母。然后,您的初始for循环将:

    1. 将字母推到original
    2. 把信推到tempStack
    3. 弹出tempStack,并将其推到reversedStack

    换句话说,这只是一种愚蠢的做法:

    1. 把信推到original
    2. 将字母推到reversedStack
    3. tempStack仍为空

    显然不是你想要的。“pop tempStack和push into reversedStack”功能需要一个新的、单独的while循环

    注:作为旁注,这是一个非常复杂的算法来完成这项工作,但大概任务是学习堆栈,并通过Rube Goldberg机器工作来完成。如果不是这样的话,只需简单地循环一次,从输入长度的0到一半,并将索引i处的字符与索引len-i处的字符进行比较,就可以完成这项工作。整个方法可以放在4行中,并且只需要0个对象就可以完成这项工作

  3. # 3 楼答案

    您不需要三个堆栈。可以使用单个堆栈解决此问题

    1. 将每个字符推送到Stack
    2. 将弹出的字符与字符串开头的字符进行比较。一旦发现不匹配,立即返回false;否则,如果所有字符都匹配,则返回true

    演示:

    import java.util.Stack;
    
    public class Main {
        public static void main(String[] args) {
            // Test
            System.out.println(isPallindrome("madam"));
            System.out.println(isPallindrome("orange"));
        }
    
        static boolean isPallindrome(String s) {
            Stack<Character> stack = new Stack<>();
            char[] arr = s.toCharArray();
            for (char c : arr) {
                stack.push(c);
            }
    
            for (char c : arr) {
                if (c != stack.pop()) {
                    return false;
                }
            }
    
            return true;
        }
    }
    

    输出:

    true
    false
    

    但是,如果您可以自由使用任何其他方法来解决此问题,下面给出的是一种更简单的方法:

    public class Main {
        public static void main(String[] args) {
            // Test
            System.out.println(isPallindrome("madam"));
            System.out.println(isPallindrome("orange"));
        }
    
        static boolean isPallindrome(String str) {
            return new StringBuilder(str).reverse().toString().equals(str);
        }
    }
    

    输出:

    true
    false