Des boucles et des Piles, palindrome devoir à la maison
-
14-11-2019 - |
Question
Je suis en train de travailler sur une affectation pour ma programmation de classe, mais j'ai éprouvé quelques difficultés et je ne sais pas où d'autre à regarder.Fondamentalement, la question nous demande d'écrire un programme qui vérifie pour les palindromes.
- L'utilisateur saisit du texte (Pas de non-alphanumberic caractères autorisés.)
- La Chaîne est poussé un caractère à la fois dans une pile
- Les personnages sont retirés un à un de la pile ainsi, l'inversion de la Chaîne de
- Si l'original est la même qu'à l'inverse, nous avons un palindrome
Je vais avoir quelques problèmes avec mes boucles et si vous ne savez pas où aller à partir d'ici, quelqu'un aurait-il des conseils ou des pointeurs?Ce que je fais mal?
Voici ce que j'ai jusqu'à présent.
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);
}
}
La solution
Cette partie:
String reverse;
...
//popping from the stack into the string
for (int i=0; i<input.length(); i++)
{
PDrome.pop()=reverse.charAt(i);
}
devrait être comme ceci:
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();
}
Notez que lorsque lorsque l'Ajout d'un grand nombre de chaînes, ce n'est pas le meilleur moyen de le faire car Java's String est immuable et à plusieurs reprises en ajoutant une chaîne nécessiterait de créer une nouvelle chaîne à chaque fois.Ce problème est suffisamment petit pour que cela ne compterait pas vraiment, mais lorsque le problème devient grand, vous voudrez utiliser StressBuffer / StringBuilder.
Autres conseils
PDrome.pop()=reverse.charAt(i);
est faux.
- l'inverse est nul -> NullPointerException
- Êtes-vous affectation d'une valeur à une fonction?(pop())
Vous devez construire revers de la pop'ping de la pile.
Donc, vous devriez commencer avec une chaîne vide: reverse = "";
et ajouter les chars pris à partir de la pile:
while (!PDrome.isEmpty())
reverse += PDrome.pop();
Nommage de détails
Veuillez utiliser des lettres majuscules pour démarrer les champs et les noms de méthode:
"someIntegerVariable"
"methodForCalculation"
et seules les majuscules de début de la classe et les noms d'interface:
Stack
ArrayList
MyClass
:)
(à partir de l'conventions Java)
De quoi êtes-vous en train de faire ici?
PDrome.pop()=reverse.charAt(i);
Vous devriez utiliser PDrome.pop()
afin de récupérer un char
à un moment et l'ajouter à reverse
.
C'est un moyen beaucoup plus propre de l'écrire à mon avis.C'est une approche récursive.
bool isPalindrome(String s)
{
if(s.length() <= 1)
return true;
return s[0] == s[s.length() - 1] && isPalindrome(s.substr(1, s.length() - 2);
}
Il est beaucoup plus court que vous pouvez le voir.