0
votes

My program works fine, but I'm getting some irregular spaces in the output. For example, if the input is 44 * 5 + 6 the output is 44<2 spaces>5<1 space>*<1space>6<no space>+. I tried fiddling with all the lines of code that are adding to the String postfix, but to no avail. I'd like the output to be of the form: operand<1 space>operand<1 space>operator (i.e. 1 space between operands and operators."

Here's my code:

import java.util.*;

public class PostfixConversion {

    public static void main(String args[]) {

        System.out.print("Enter an expression: ");
        String infix = new Scanner(System.in).nextLine();

        String postfix = convertToPostfix(infix);

        System.out.println(postfix);

        //System.out.println("The result of calculation is: " + postfixEvaluate("23+"));

    }

 //converts infix expression into postfix expression
    public static String convertToPostfix(String infixExp) {
         String postFix = "The Postfix Expression is: ";
         Stack<Character> stack = new Stack<Character>();
         char character = ' ';

         for(int i = 0; i < infixExp.length(); i++)
         {
             character = infixExp.charAt(i);

             //determine if character is an operator
             if(character == '*' || character == '-' || character == '/' || character == '+')
             {
                 //postFix += " ";

                 while(!stack.empty() && precedence(stack.peek(), character))
                     postFix += stack.pop();

                 stack.push(character);
             }  else if(character == '(') {
                 stack.push(character);
             }  else if(character == ')') {
                 while(!stack.peek().equals('(') && !stack.isEmpty())
                     postFix += stack.pop();

                 if(!stack.isEmpty() && stack.peek().equals('('))
                     stack.pop(); // pop/remove left parenthesis
             }  else
                 postFix += character;
         }
         while(!stack.empty()) //add the remaining elements of stack to postfix expression
         {
             if(stack.peek().equals('('))
             {
                 postFix = "There is no matching right parenthesis.";
                 return postFix;
             }
             postFix += stack.pop();
         }
             return postFix;
    }

    public static boolean precedence(char first, char second) {
          int v1 = 0, v2 = 0;
          //find value for first operator
          if(first == '-' || first == '+')
             v1 = 1;
            else if(first == '*' || first == '/')
                v1 = 2;    

          //find value for second operator
          if(second == '-' || second == '+')
             v2 = 1;    
            else if(second == '*' || second == '/')
                v2 = 2;    

         if(v1 < v2)
            return false;

         return true;
    }
1
Not just irregular space. It just does not handle space correctly. e.g if I pass 5+2 without anyspace, the out does not add any space. That shall give you a clue and you can validate using a debugger - Optional
yeah, that's one of the requirements of the assignment. Our Prof. told us to add a space between operand and operator "to make our lives easier". So followed the guidelines. - Bharat Edupghanti
What i am saying is that space is not getting added properly. If I don't give space between operand then, your program does not add it :) - Optional

1 Answers

1
votes

First remove all whitespaces from input, so that they don't destroy your formatting:infixExp = infixExp.replaceAll("\\s",""); and then add whitespaces where needed.