2

編集 - コードを修正し、元の作業を新しいコードに置き換えましたが、まだ同様の問題があります

私が取っているこのデータ構造のクラスは、私の最初のプログラミング コースなので、少し私の要素から外れています。最初のプロジェクトは本当に私のお尻を蹴っています。逆ポーランド記法電卓を作ることです。多かれ少なかれ完全ですが、多くのバグがあります。コードの微調整に何時間も費やしてきましたが、ある問題に対処すると、別の問題が発生します。私の恐ろしいプログラミングスキルを前もってお詫び申し上げます。

public class ReversePolishStack {

class SinglyLinkList {
    Node head = null;

    public void push(float newData) {
        Node cache = this.head;
        this.head = new Node(newData, cache);
    }

    public float pop() {
        float out = this.head.data;
        head = head.next;
        return out;
    }
    public void add(float num1, float num2) {
            num1 = pop();                       
            num2 = pop();
            push(num1+num2);
        }
    public void sub(float num1, float num2) {
            num1 = pop();                       
            num2 = pop();
            push(num2-num1);
        }
    public void div(float num1, float num2) {
            num1 = pop();                       
            num2 = pop();
            push(num2/num1);
        }
    public void mult(float num1, float num2) {
            num1 = pop();                       
            num2 = pop();
            push(num1*num2);
        }
    class Node {
        public float data;
        public Node next;

        public Node(float data, Node next) {
            this.data = data;
            this.next = next;
        }
    }
}     
/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    ReversePolishStack rps = new ReversePolishStack();
    SinglyLinkList sll = rps.new SinglyLinkList(); 
    String entry;
    do
    {
        System.out.print("Enter Expression:\n");       
        Scanner in = new Scanner(System.in);
        entry =in.nextLine();           
        StringTokenizer st = new StringTokenizer(entry," ");                        
        String s1;
        int count = 0;
        while (st.hasMoreElements()) 
        {               
            if (entry.length()<4)   {// for an error message not enough input
                System.out.print("Not enough input"); break;
            }
            else if (count>1 && sll.head.next==null) {
                System.out.print("Not enough operands"); break;
            }                             
            s1 = st.nextToken();          
            if((s1.equals("+") || s1.equals("-") || s1.equals("*") || s1.equals("/")))  {                             
                if(s1.equals("+"))
                    sll.add(sll.head.data, sll.head.next.data);
                else if(s1.equals("-"))
                    sll.sub(sll.head.data, sll.head.next.data);
                else if(s1.equals("/")) {
                    if (sll.head.data==0)   {
                        System.out.println("Division by Zero enounterd."); break;
                    }
                    sll.div(sll.head.data, sll.head.next.data);
                }
                else if(s1.equals("*"))
                    sll.mult(sll.head.data, sll.head.next.data);
                else
                    System.out.print("Unrecognized input");break;
            }
            else {
                sll.push(Float.parseFloat(s1));
            }
            count++;
        }
        System.out.println(sll.head.data);
        sll.pop();
    } while(entry.equals("0")== false); // typeing a single zero terminates
    System.out.print("Thanks for using my RPN Calculator!");
}

}

私はしばらくこれに取り組んできましたが、バグを修正しようとするたびに、コードである畳み込みにも追加したと確信しています。どんな助けでも大歓迎です!

4

1 に答える 1

0

まず、定義したクラスをメイン メソッドから取り出す必要があります。その後、外部クラス ( ) を作成せずにクラスsinglyLinkList( )のインスタンスを作成したため、エラーが発生します。singlyLinkList sll = new singlyLinkList();ReversePolishStack

ネストされたクラスに関するこのリンクを参照してください。

Nodeクラスもクラスに入れsinglyLinkListます(ところで、このクラスの名前SinglyLinkListを最初の文字を大文字にして名前を変更する必要があります)。

私はあなたのコードのロジックには入りませんでしたが、少なくともこれらの修正の後、あなたのコードはコンパイルされます:

public class ReversePolishStack {

    class singlyLinkList {
        Node head = null;

        public void push(float newData) {
            Node cache = this.head;
            this.head = new Node(newData, cache);
        }

        public float pop() {
            float out = this.head.data;
            head = head.next;
            return out;
        }

        class Node {
            public float data;
            public Node next;

            public Node(float data, Node next) {
                this.data = data;
                this.next = next;
            }
        }
    }

    /**
     * @param args
     *            the command line arguments
     */
    public static void main(String[] args) {
        float number1;
        float number2;
        ReversePolishStack rps = new ReversePolishStack();
        singlyLinkList sll = rps.new singlyLinkList();
        System.out.print("Enter Expression:\n");
                // from here will be the same as you wrote
        }
}

ReversePolishStackまた、メイン メソッドからプログラムのロジックを抽出し、oop の概念を使用するためにメソッドを作成することをお勧めします。

これが役に立ったことを願っています!チャオ!

于 2013-10-11T10:22:59.247 に答える