【问题标题】:Loops and Stacks, palindrome homework assignmentLoops and Stacks,回文作业
【发布时间】:2012-01-25 14:38:35
【问题描述】:

我正在为我的编程课做作业,但遇到了一些困难,我不知道还能去哪里找。基本上这个问题要求我们编写一个检查回文的程序。

  • 用户输入文本(不允许使用非字母数字字符。)
  • 将字符串一次一个字符压入堆栈
  • 字符从堆栈中一次拉出一个,从而反转字符串
  • 如果原件与反件相同,则我们有回文

我的循环遇到了一些问题,不知道从哪里开始,有没有人有任何建议或指示?我做错了什么?

这是我目前所拥有的。

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

【问题讨论】:

    标签: java palindrome stack


    【解决方案1】:

    这部分:

    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。

    【讨论】:

    • 我会记住这一点,谢谢您的回复。帮了大忙!
    • +1:用于StringBuffer 建议。一件事:StringBuffer 是同步的。从 Java 5 开始就有StringBuilder。它是相同的,但不是同步的,因此更适合单线程需求,例如在方法中将其用作局部变量(大部分时间)。
    【解决方案2】:

    PDrome.pop()=reverse.charAt(i); 错误。

    1. reverse 为 null -> NullPointerException
    2. 您是否正在为函数赋值? (pop())

    您必须构建从堆栈中弹出的反向操作。

    所以你应该从一个空字符串开始:reverse = "";,然后添加从堆栈中取出的字符:

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

    命名细节

    请使用非大写字母开始字段和方法名称:

    "someIntegerVariable"
    "methodForCalculation"
    

    并且只有大写字母才能开始类和接口名称:

    Stack
    ArrayList
    MyClass
    

    :)

    (来自 Java 约定)

    【讨论】:

    • 啊啊啊啊!我明白我做错了什么,在我的脑海中是有道理的,但我看不出它是怎么错的。另外,感谢顶上的方法
    • @Eogcloud - 考虑使用 StringBuilder 而不是连接字符 - 已经习惯了良好的做法 :) (字符串连接将导致在每个连接上分配一个新的字符串对象!)
    【解决方案3】:

    你到底在做什么?

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

    您应该使用PDrome.pop() 一次检索一个char 并将其附加到reverse

    【讨论】:

    • 是的,它几乎比任何试图理解我的想法的伪代码都多,不过我明白我错了!
    【解决方案4】:

    在我看来,这是一种更简洁的书写方式。这是一种递归方法。

    bool isPalindrome(String s)
    {
        if(s.length() <= 1)
            return true;
    
        return s[0] == s[s.length() - 1] && isPalindrome(s.substr(1, s.length() - 2);
    }
    

    如您所见,它要短得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-04
      • 2017-01-02
      • 2019-06-21
      • 2016-01-09
      • 2016-01-30
      • 2013-05-01
      • 2019-05-12
      • 2012-03-19
      相关资源
      最近更新 更多