Postfix RPN Calculator调试

时间:2014-03-26 13:26:25

标签: java postfix-notation

我试图编写一个程序来运行计算器使用反向抛光表示法,我遇到了一些问题,我在代码中有注释解释它们,所以如果有人可以伸出援助之手,我将不胜感激!  我知道它与尝试在堆栈中获得位置-1有关,但我似乎无法解决它。

 import java.io.BufferedWriter;
        import java.io.IOException;


        public class Calculator {

            ArrayStack<Integer> stack;
            BufferedWriter out;
            public Calculator(BufferedWriter out) {
            this.out=out;
            }

            public void processLine( String line ) throws IOException {


                stack = new ArrayStack<>();
                String [] s = line.split ("\\s+");
                int operador1;
                int operador2; 
                int x=0;
                String operator;


            if (s[0].charAt(0)!='-'){     /if a string starts with a "-" it should be interpreted as a comment/
                if (isNumber(item)) {
                    int c = Integer.parseInt(item);
                    stack.push(c);
                } else {

                switch(item){ 

                    case "*":               /multiplies the last two entries in stack/
                        operador1= stack.peek();
                        stack.pop();
                        operador2=stack.peek();
                        stack.pop();
                        stack.push(operador2*operador1);
                        break;

                    case "/":    /divides the last two entries in stack/
                        operador1= stack.peek();
                        stack.pop();
                        operador2=stack.peek();
                        stack.pop();
                        stack.push(operador2/operador1);
                        break;

                    case "+":      /sums last two entries in stack/
                        operador1= stack.peek();
                        stack.pop();
                        operador2=stack.peek();
                        stack.pop();
                        stack.push(operador2+operador1);
                        break;

                    case "-":    /subtracts last two entries in stack/
                        operador1= stack.peek();
                        stack.pop();
                        operador2=stack.peek();
                        stack.pop();
                        stack.push(operador2-operador1);
                        break;

                    case "%":        /divides last two entries in stack/
                        operador1=stack.peek();
                        stack.pop();
                        operador2=stack.peek();
                        stack.pop();
                        stack.push(operador2%operador1);
                        break;

                    case ".":    /removes top of stack and writes in output file/
                        operador1=stack.peek();  /error here ArrayIndexOutOfBoundsException: -1/
                        stack.pop();
                        out.write(operador1);
                        out.newLine();
                        break;

                    case "@x":  /removes top of stack and puts it in x/
                        x= stack.peek();
                        stack.pop();
                        break;

                    case "x":    /puts x in the stack's top/
                        stack.push(x);
                        break;

                    case "dup":  /repeats top of stack in stack/
                        operador1=stack.peek();
                        stack.push(operador1);
                        break;

                    case "swap": /swaps the last two entries/
                        operador1=stack.peek();
                        stack.pop();
                        operador2=stack.peek();
                        stack.pop();
                        stack.push(operador2);
                        stack.push(operador1);
                        break;

                    case "drop":   /remove top of stack/
                        stack.pop();


                }
                }
            }
            }
            System.out.println(" ");
            }


            public boolean isNumber (String x){

        try{
                int y=Integer.parseInt(x);
                return true;
            } catch (NumberFormatException e){
                return false;
            }

        }
            }

1 个答案:

答案 0 :(得分:0)

在我看来,你的切割和粘贴可能会有点过快。 您的代码有几个不清楚的地方。很难准确猜测 你需要什么帮助,但如果你有一些你可能想澄清的事情 希望得到更好的帮助:

  • 您的括号数量不匹配。我怀疑System.out.println(" ");之前的那个是应该去的那个。

  • 你不会遍历字符串数组,只需查看一次即可。这看起来很可疑。 更重要的是,因为您为ArrayStack每次调用创建一个新的processLine 不清楚你是打算一次只处理一个令牌还是一次处理所有令牌。

  • 您选择的注释语法似乎与否定运算符冲突。我猜这个 如果你想要一次处理所有的令牌,因为操作员不能成功 首先要阅读的内容,但为了便于编码和调试,它并不是最符合您的符号。

  • item变量未在任何地方定义。

  • operator变量未在任何地方使用。

  • 您没有输入字符串的验证,您是否认为它总是很好 形成的呢?如果是这样的话,那么发布输入也是好的,因为那里是失败的 是设计失败的几个输入。