2

编辑 - 我修改了我的代码并用新代码替换了我原来的工作,仍然有类似的问题

我正在学习的这个数据结构课程是我的第一门编程课程,所以我有点脱离了我的元素。第一个项目真的让我大吃一惊。它是做一个逆波兰符号计算器。它或多或少是完整的,只是有很多错误。我一直在花费数小时来调整我的代码,但是当我解决一个问题时,它就会释放出另一个问题。我提前为我糟糕的编程技巧道歉。

公共类 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

首先,您应该从 main 方法中取出您定义的类。之后,您将收到一个错误,因为已创建类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
        }
}

我还建议您从 main 方法中提取程序的逻辑并在其中创建方法,ReversePolishStack以便使用 oop 概念。

希望这很有用!再见!

于 2013-10-11T10:22:59.247 回答