1

スタックとリンク リストを使用して回文チェッカーを構築しようとしています。ノードと構造を再利用してこの割り当ての 2 つの部分を完了するためにジェネリックを使用しています (次の部分で別のことを達成するため)。

プログラムは文字をスタックにプッシュしていません。null を返しています。問題は、LinkedStack の構築、または StackDriver の実装、あるいはその両方での push メソッドの構築にあると思います。何が間違っているのかわかりません。私は多くの代替案を試し、プッシュメソッドを構築するために他の方法を調べて試しましたが、エラーが発生し、プログラムをまったく実行できません。(私がここに持っている 2 つのプッシュ方法が異なることに気付きました - これらは私が試した 2 つのバージョンです)。char c がラッパー クラスを使用するための何らかのタイプのボクシングを検討する必要がありますか?

プログラムは、実行された最後のポイントに戻されました。「反転」されたポップ要素は、正しい文字数を取得しているように見えますが、なぜですか?

このプログラムには他にも問題があることはわかっていますが、このつまずきを乗り越えるまでは対処できないと感じています。任意の支援をいただければ幸いです - ありがとう!

マイク

指定されたインターフェース:

public interface Stack<E> {
   void push(E data);
   E pop();
   boolean isEmpty();
   int size();
   E stackTop();
   void clear();
}

ノードとメソッド:

public class Node<E>  {

// create the node structure
    private E data;
    private Node<E> next;


    // getters and setters  
    public E getData() {
        return data;
    }
    public void setData(E data) {
        this.data = data;
    }
    public Node<E> getNext() {
        return next;
    }
    public void setNext(Node<E> next) {
        this.next = next;
    }

}

スタック:

import java.util.EmptyStackException;


public class LinkedStack<E> implements Stack<E>{

// Create the head and nodeCount variables
private Node<E> head;
private int nodeCount;

// also need to be able to convert letters to capitals.

// constructor for the LinkedStack
public LinkedStack()
{
    clear();
}


// A method to push the data onto a stack and increment the node count
public void push(E data) {
    head = new Node<E>();
    nodeCount++;
    }


// pop the head off of the stack and decrement the node count
public E pop() {
    E item;

    if (head == null)
        throw new EmptyStackException();

    item = head.getData();
    head = head.getNext();
    nodeCount--;
    return item;
}


// Check if the stack is empty
public boolean isEmpty() {
    if (head == null);
    return true;
}


// check the size of the node
public int size() {
    return nodeCount;
}


// this is the peek method
public E stackTop() 
{
    if (head == null)
        throw new EmptyStackException();
    return head.getData();
}


// clear the Linked Stack
public void clear() {
    head = null;
    nodeCount = 0;
}

// convert to text
        public String toString() {
            String rtn = "";

            if (nodeCount == 0) {
                rtn += "<empty>";
            }
            else {
                Node<E> t = head;

                while (t != null){
                    /* return the node data on a line with the head node data
                     at the beginning of the line and the arrow pointing to 
                     each successive node*/
                    rtn += t.getData() + "->";
                    // go on to the next
                    t = t.getNext();
                }
            rtn += "null";
            }
            return rtn;

        }


        }

そしてドライバー:

import java.util.Iterator;
import java.util.Scanner;

public class StackDriver<E> implements Iterator<E>{

/**
 * @param args
 */
public static void main(String[] args) {

//Initialize the driver
StackDriver run = new StackDriver();
run.doIt();

}
public void doIt() {

    // gather the input
    Scanner keyboard = new Scanner(System.in);
    System.out.println("Please enter a phrase. This program will verify" +
            " if the phrase is a palindrome.");

    // holder for the phrase
    String phrase;

    // holder for the reversed phrase
    String reversed = "";

    phrase = keyboard.nextLine().toUpperCase();
    System.out.println("You entered: "+ phrase);

    // create the two stacks for the characters
    LinkedStack<E> alpha = new LinkedStack<E>();
    LinkedStack<E> punctuation = new LinkedStack<E>();

    //------------------------------------------
        for(int i=0; i<phrase.length(); i++)
        {
        // if the character is a letter, push it onto the letters stack
            char c = phrase.charAt(i);
            if (true == Character.isLetter(c))

        {
            // (testing purposes only- remove next line)
                System.out.println("LETTER");
                String A = Character.toString(c);

            // push the letter onto the stack   
                alpha.push((E) new Node<E>());      
        }

        // else push it onto the characters stack
        else
        {
            // (testing purposes only- remove next line)
            System.out.println("NOT LETTER");
            String B = Character.toString(c);

            // push the character onto the stack
            punctuation.push((E) new String(B));    
        }
            // then pop the letters stack
        while (!alpha.isEmpty());   
        {
            reversed += alpha.pop();
        }
        }
        //------------------------------------------
    // if it equals the String phrase
        if (reversed == phrase)
            // it is a palindrome
            System.out.println("The phrase you entered is a palindrome");
    else
        System.out.println("The phrase you entered is NOT a palindrome");
        System.out.println("phrase: " + phrase);
        System.out.println("alpha: " + alpha);
        System.out.println("reversed: " + reversed);
}
@Override
public boolean hasNext() {
    // TODO Auto-generated method stub
    return true;
}
@Override
public E next() {
    // TODO Auto-generated method stub
    return null;
}
@Override
public void remove() {
    // TODO Auto-generated method stub

}


}

そして結果:

Please enter a phrase. This program will verify if the phrase is a palindrome.
mom
You entered: MOM
LETTER
LETTER
LETTER
The phrase you entered is NOT a palindrome
phrase: MOM
alpha: <empty>
reversed: nullnullnull
4

3 に答える 3

4

私があなたの質問をきちんと受けたなら、問題は確かにクラスpushでのあなたのメソッドだと思います。LinkedStack見てください。

public void push(E data) {
    head = new Node<E>();
    nodeCount++;
}

新しいヘッドを作成し、Nodeそれに割り当ててhead、スタックのノード数を増やしますが、実際に古いヘッドをリンクしたり、新しい現在のヘッドにデータを追加したりすることはありません。ヘッドを、前または次の要素がない新しいノードに置き換えるだけです。

于 2013-02-27T18:05:27.317 に答える
2
// A method to push the data onto a stack and increment the node count
public void push(E data) {
    head = new Node<E>();
    nodeCount++;
    }

この方法は間違っています。next新しいノードをプッシュするときは、それを現在のヘッドに設定する必要があります。また、そのノードにデータを入力する必要があります。

于 2013-02-27T18:08:20.063 に答える
0

これはあなたの全体の問題かもしれないし、そうでないかもしれませんが、それは間違いなくそれの一部です...

// A method to push the data onto a stack and increment the node count
public void push(E data) {
    head = new Node<E>();
    nodeCount++;
}
  • Eタイプのオブジェクトが渡された場合でも、常にヘッドをデータを含まない新しいノードに置き換えます。head.setData(data)を呼び出す必要があります。
  • ヘッドを交換するのではなく、リストに追加する必要もあります。
    if(head == null){head = new Node(); head.setData(data); }else{ノードn=new Node(); n.setData(data); 最後のノード=...; //リーダーの演習として、リストの最後のノードを取得したままにしますlast.setNext(n); }
于 2013-02-27T18:17:55.533 に答える