使用负数评估Post修复

时间:2014-11-04 19:14:58

标签: java stack postfix-notation

我很难弄清楚如何让我的后缀来评估负数。

我的中缀到postfix似乎与负数一致,例如我的程序中的示例.. 中缀:( - 3)+ 5 * 3 后缀:3-53 * +

这是我的评估方法,我知道要查看的代码越少越好,如果您希望看到我的代码中的任何其他代码,请告诉我。我尝试过很多东西,但没有运气,任何建议或建议都会受到赞赏!

    public int evaluate(String evalute){
   int number1;
   int number2;
   int result = 0;
   int finalResult = 0;

   Stack<Integer> d = new Stack<Integer>();

   for(int i = 0; i < evalute.length(); i++){
     char curChar = evalute.charAt(i);
     if(curChar >= 48 && curChar <= 57){
       int store = curChar;
       store -=48;
       d.push(store);

     }

     else if(curChar == '+'){
       number1 = d.pop();
       number2 = d.pop();
       result = number1 + number2;
       d.push(result);
     }

     else if(curChar == '-'){
       number1 = d.pop();
       number2 = d.pop();
       result = number2 - number1;
       d.push(result);
   }
     else if(curChar =='*'){
       number1 = d.pop();
       number2 = d.pop();
       System.out.println(result = number1 * number2);
       d.push(result);
     }
     else if(curChar =='/'){
       number1 = d.pop();
       number2 = d.pop();
       result = number2 / number1;
       d.push(result);
     }
   }


   finalResult = d.pop();
   return finalResult;
 }

2 个答案:

答案 0 :(得分:0)

我会举个例子

中缀:( - 3)+ 5 * 3后缀:3-53 * +

EVAUATION
push 3

read - ---> you have no 2 elements in the stack -> EXCEPTION 
(or by luck you can have 2 but is not the behavior you want)

这似乎一切都好,但是......你怎么区分一元减号和二元减号?当你阅读3 - 3时,你是否用两个操作数或两个带反符号的原始操作数读取减法运算?

采用的最简单的解决方案是使用不同的符号来标记负数,例如!字母N或任何不同于减去自我的东西,其他明智的当你读取减去你的流行音乐时关闭堆栈中的2个元素,然后执行减法。

相反,您希望阅读!这样的符号,然后弹出1个元素(d),然后将其推回堆栈-d ..

所以从(-3)+ 5 * 3后缀:3!53 * +

EVALUATION
push 3

read ! --> pop 3 and push -3

push 5 - push 3

read * ---> pop 5 - pop 3 push 3*5

read + ---> pop 15 (= 3*5) pop -3 and push 15 + (-)3

通过使用这两个不同的符号,您已经解决了问题..

答案 1 :(得分:-1)

嗯,我想它正在解析字符串阶段。 您的解析器应检测它是否为负数或正数,生成令牌后,您可以继续将中缀转换为后缀并评估后缀。我希望它有所帮助:)