【问题标题】:java infix calculatorjava中缀计算器
【发布时间】:2013-02-11 11:56:53
【问题描述】:

我似乎无法在 try 块的内部进行堆栈,我的意思是通过在 try 块中使用堆栈来获得一个位数的计算器。 try 块的内部给了我 emptystackexception

import java.util.EmptyStackException;
import java.util.*;

public class Infix
{
    public static void main(String[] args){

        System.out.println(evaluateInfix("1*2*3"));

    }
public static double evaluateInfix(String infix)
    {
        try
        {
            Stack<Character> valueStack = new Stack<Character> ();
            Stack<Character>  operatorStack = new Stack<Character> ();
            double result;
            for(char ch: infix.toCharArray()){
                if(ch >= 0 && ch <= 9){
                    valueStack.push(ch);
                } else if(ch == '('){
                    operatorStack.push(ch);
                } else if(ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%' || ch == '^' || ch == '='){
                    if(operatorStack.isEmpty()){
                        operatorStack.push(ch);
                    } else if(precedence(ch) > precedence(operatorStack.peek())){
                        operatorStack.push(ch);
                    } else {
                        while(!operatorStack.isEmpty() && precedence(ch) <= precedence(operatorStack.peek())){
                            result = compute(valueOf(valueStack.pop()), valueOf(valueStack.pop()), operatorStack.pop());
                            valueStack.push((char)result);
                        }
                        operatorStack.push(ch);
                    }
                } else if(ch == ')'){
                    while(operatorStack.peek() != '('){
                        result = compute(valueOf(valueStack.pop()), valueOf(valueStack.pop()), operatorStack.pop());
                        valueStack.push((char)result);
                    }
                    operatorStack.pop();
                }
            }

            while(!operatorStack.isEmpty()){
                result = compute(valueOf(valueStack.pop()), valueOf(valueStack.pop()), operatorStack.pop());
                valueStack.push((char)result);
            }
            result = valueStack.peek();

            System.out.println(result);


            /* **********
            Task 3
            complete this section to calculate the infix expression
            */        



        } //end try
        catch (EmptyStackException e)
        {
            /* **********
            Task 3
            complete this to return Double.NaN
            */            
        }
        catch (ArithmeticException e)
        {
            /* **********
            Task 3
            complete this to return Double.NEGATIVE_INFINITY
            */            
        }
        return 3.0;

    } // end evaluateInfix

    private static int precedence(char operator)
    {
        switch(operator){
            case '(': case ')': return 0;
            case '+': case '-': return 1;
            case '*': case '/': case '%': return 2;
            case '^': return 3;
            case '=': return 4;
        }
        return -1;
    }

    private static double valueOf(char variable)
    {
        switch (variable)
        {
            case '1': return 1.0;
            case '2': return 2.0;
            case '3': return 3.0;
            case '4': return 4.0;
            case '5': return 5.0;
            case '6': return 6.0;
            case '7': return 7.0;
            case '8': return 8.0;
            case '9': return 9.0;
            case '0': return 0.0;
        } // end switch

        return 0;
    } // end valueOf

    private static Double compute(Double operandOne, Double operandTwo, char operator)
    {
        if(operator == '+'){
            return operandOne + operandTwo;
        } else if(operator == '-'){
            return operandOne - operandTwo;
        } else if(operator == '*'){
            return operandOne * operandTwo;
        } else if(operator == '/'){
            return operandOne / operandTwo;        
        } else if(operator == '%'){
            return operandOne % operandTwo;
        } else if(operator == '^'){
            return Math.pow(operandOne, operandTwo);
        } else {
            return null;
        }
    } // end compute
} // end Infix

【问题讨论】:

    标签: java stack calculator infix-notation


    【解决方案1】:

    第一个 if 不应该在数字周围包含 '' 吗?

    if(ch >= '0' && ch <= '9'){
    

    【讨论】:

    • 好点。否则,valueStack 将始终为空。这就是为什么你实际上得到了 emptystackexception ;)
    【解决方案2】:

    你有一对冗余的“}”和“{”,它们将你的大部分代码变成了一个初始化块——本质上是一个中缀类的构造函数。

    (根据您的评论)- 缺少方法声明。

    尝试更改前几行:

    public class Infix {
      public static void main(String[] args){
        System.out.println(evaluateInfix("1*2*3"));
      }
    
      {
        try {
          ...
    

    到:

    public class Infix {
      public static void main(String[] args){
        System.out.println(evaluateInfix("1*2*3"));
      }
    
      public static double evaluateInfix(String infix) {
        try {
          ...
    

    【讨论】:

    • try 块用于方法 evaluateInfix 如果我要删除括号代码将无法编译
    • 对不起,我在清除一些东西时不小心删除了方法
    • 相应地修正了答案。
    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 2017-01-27
    • 2014-01-08
    • 2015-07-24
    • 2013-03-14
    • 2018-03-20
    • 1970-01-01
    • 2012-04-11
    相关资源
    最近更新 更多