使用java中的堆栈评估postfix表达式

时间:2014-05-13 18:52:44

标签: java data-structures stack

我正在尝试编写用于后缀评估的代码,但我收到错误

java.lang.String无法强制转换为java.lang.Integer,问题在于行obj1=(int) calStack.topAndpop();。问题是我的ArrayStack topAndpop()方法返回 Object 类型如

 public Object topAndpop() throws EmptyStackException{
    Object returnPop;
        if (isEmpty())
            throw new EmptyStackException("Stack empty");
        else{ 
            returnPop=top();
            pop();
            }
        return returnPop;

我应该可以将它转换为int类型。除了这行之外,我看不出任何错误。有人指出我如何纠正这个

import java.lang.Math;
public class Calculate{
    double result=0;
    int obj1,obj2;
    public Object cal(String expression) throws OverFlowException,EmptyStackException{

    String[] array = expression.split("");//remember
    // for (int i=0;i<array.length;i++)
        // System.out.println(array[i]);
    ArrayStack calStack=new ArrayStack(array.length);
    for(int i=0;i<array.length;i++){
        if(!(array[i].equals("+") || array[i].equals("-")||array[i].equals("/") || array[i].equals("*"))){
            calStack.push(array[i]);
        //calStack.print();
        }
        else {

            obj1=(int) calStack.topAndpop();//check how this casting is done
            obj2=(int)calStack.topAndpop();
        result=calculate(obj2,obj1,array[i]);
        System.out.println(result);
        calStack.push(result);
        }
    }
    return calStack.topAndpop();

}
public double calculate(int a,int b,String op){
    if(op=="+")
        return a+b;
    else if(op=="-")
        return a-b;
    else if(op=="/")
        return a/b;
    else if (op=="^")
        return Math.pow(a,b);
    else 

        return a*b;

}

public static void main (String args[]) throws OverFlowException,EmptyStackException{
    Calculate c=new Calculate();
    System.out.println("result"+c.cal("623+-382/+*2^3"));

}

}

3 个答案:

答案 0 :(得分:1)

而不是

obj1=(int) calStack.topAndpop();//check how this casting is done
obj2=(int)calStack.topAndpop();

使用:

obj1 = Integer.parseInt((String)calStack.topAndpop());
obj2 = Integer.parseInt((String)calStack.topAndpop());

答案 1 :(得分:0)

你有一个以上的问题,第一个字符串相等 -

public double calculate(int a,int b,String op){
  if(op.equals("+")) // <-- .equals! Not ==
    return a+b;
  else if(op.equals("-"))
    return a-b;
  else if(op.equals("/"))
    return a/b;
  else if(op.equals("^"))
    return Math.pow(a,b);
  else 
    return a*b;
}

接下来,由于您的堆栈似乎不是generic,因此您应该致电Integer.parseInt(String)

obj1 = Integer.parseInt(calStack.topAndpop().toString());

答案 2 :(得分:0)

问题出在你检查符号的if条件中,你错过了^符号:

         if(!(array[i].equals("+") || array[i].equals("-")
              ||array[i].equals("/") || array[i].equals("*"))){

添加^符号的条件如下,您的代码将起作用:

          if(!(array[i].equals("+") 
               || array[i].equals("-")
               ||array[i].equals("/") 
               || array[i].equals("*"))
               || array[i].equals("^"))){

            // do something 
          }