2014-11-04 64 views
0

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

我缀以后缀似乎正常工作与负数,如例如从我的节目.. 缀:(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; 
} 

回答

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

添加一些更多的细节,也许一个代码块来澄清你的答案。 – UditS 2016-04-28 11:55:18