Question

I'm writing a program that converts an expression from infix to postfix. I have the conversion part down but when it comes to evaluating the postfix expression, I run into problems with converting from char to int using the stack.

I keep getting the error: "Exception in thread "main" java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.Integer"

It might be in this part of the code below where the problem is but I'm not sure:

  Integer x1 = (Integer)stack2.pop();
  Integer x2 = (Integer)stack2.pop();

Thank you!

public class Calc {

/**
 * @param args the command line arguments
 */


public static void main(String[] args) {


System.out.println("Please enter your infix expression: ");    
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();

String postfix = "";
Stack<Character> stack = new Stack<Character>();

for(int i = 0; i < input.length(); i++){
    char subject = input.charAt(i);
    if (subject == '*'||subject == '+'||subject == '-'||subject == '/'){           
    while ((stack.empty() == false) && (order(stack.peek()) >= order(subject)))
      postfix += stack.pop() + " ";
      stack.push(subject);                
    }       
    else if(subject == '(')
    {
      stack.push(subject);
    }
    else if(subject == ')')
    {
      while(stack.peek().equals('(') == false){
      postfix += stack.pop() + " ";
    }
      stack.pop(); 
    }
    else{
        if((Character.isDigit(subject) == true) && ((i + 1) < input.length()) && (Character.isDigit(input.charAt(i+1)) == true))
        {
            postfix += subject;
        }
        else if(Character.isDigit(subject))
        {
            postfix += subject + " ";
        }   
        else
        {
            postfix += subject;
        }
    }
}

postfix += stack.pop();
System.out.println("Your post-fix expression is: " + postfix);

char subject2;
int yeah;

Stack stack2 = new Stack();
for (int j = 0; j < postfix.length(); j++){
    subject2 = postfix.charAt(j);
    if(Character.isDigit(subject2) == true){
         stack2.push(subject2);
    }
    if(subject2 == ' '){
        continue;
    }
    else{
        Integer x1 = (Integer)stack2.pop();
        Integer x2 = (Integer)stack2.pop();
        if (subject2 == '+'){
            yeah = x1 + x2;
        }
        if (subject2 == '-'){
            yeah = x1 - x2;
        }
        if (subject2 == '*'){
            yeah = x1 * x2;
        }
        if (subject2 == '/'){
            yeah = x1 / x2;
        }
        else {
            yeah = 0;
        }
    }
}
yeah = (int) stack2.pop();

System.out.println("The result is:" + yeah);


}
static int order(char operator)
{
    if(operator == '+' || operator =='-')
    return 1;
    else if(operator == '*' || operator == '/')
     return 2;
else
    return 0;
}
    }
Was it helpful?

Solution

You can solve this by casting to int. Note that int and Integer are not the same:

Integer x1 = (int) stack2.pop();
Integer x2 = (int) stack2.pop();

OTHER TIPS

no casting is necessary by using type-information

Stack<Integer> stack2 = new Stack<Integer>();
  …
  if(Character.isDigit(subject2) == true){
    stack2.push( Character.getNumericValue( subject2 ) );
  }
  …

to prevent an empty stack exception I'd prefer poll over pop
so it is easier to check an error condition
eg. if( x1 == null ) System.err.println( "Your error message" );

Deque<Integer> stack2 = new ArrayDeque<Integer>();
  …
  Integer x1 = stack2.poll();
  Integer x2 = stack2.poll();
  …

btw: the program is syntactically wrong, because it puts only one value on the stack

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top