Transforming Infix to Postfix in Java: Solving Arithmetic Expressions with RPN

  • Context: Java 
  • Thread starter Thread starter muna580
  • Start date Start date
  • Tags Tags
    Arithmetic Java
Click For Summary

Discussion Overview

The discussion revolves around transforming arithmetic expressions from infix to postfix notation (Reverse Polish Notation) using Java. Participants are exploring the implementation of operator precedence, methods for evaluating expressions, and challenges faced during coding.

Discussion Character

  • Technical explanation
  • Homework-related
  • Debate/contested

Main Points Raised

  • One participant seeks assistance in creating a method to determine operator precedence, specifically for operators like +, -, /, *, and %.
  • Another participant prompts a discussion on how to teach operator precedence to a child, suggesting a need for foundational understanding.
  • There is a mention of a precedence order proposed by a participant, which lists *, /, +, - but questions the position of the % operator.
  • One participant suggests creating a syntax diagram to aid in coding the transformation and evaluation process.
  • A suggestion is made to look up operator precedence orders in relevant programming literature, with a recommendation to assign integer values to each operator for easier comparison.
  • A participant shares their experience with a C implementation of a similar program, discussing the complexity of parsing and the use of binary trees versus stacks for expression evaluation.
  • Another participant reflects on their experience transitioning from Java to C for the same task, highlighting the challenges faced and suggesting recursive approaches for parsing expressions.

Areas of Agreement / Disagreement

Participants express varying opinions on the operator precedence and methods for implementing the transformation and evaluation of expressions. There is no consensus on the best approach or the exact precedence of operators, particularly regarding the modulus operator.

Contextual Notes

Participants reference different programming languages (Java and C) and their respective challenges, indicating that solutions may depend on language-specific features. The discussion includes unresolved questions about operator precedence and implementation strategies.

Who May Find This Useful

This discussion may be useful for programmers working on expression parsing, students learning about operator precedence, and those interested in algorithm design for arithmetic evaluations.

muna580
I am creating a class that will transform a basic arithmetic expression from infix to postfix (Reverse Polish Notation (RPN)). Then after then, it will evaluate the postfix expression and give the answer.

I have having a little trouble with the operators (+,-,/,0*, and %). Like, I have to create a method called hasHigherPrecedence(char c1, char c2), which returns a boolean saying where c1 has a higher precedence than c2. But I don't really know hwo to create this method. Can someone help me.
 
Technology news on Phys.org
Forget programming for a moment.

If I asked you to tell me which of "+" or "*" had higher precedence, what would you do to figure it out?

What if you had to teach a 10-year hold how to figure it out? How would you do that?
 
Umm, I think this is the precedence order from highest to lowest: * / + -. Where does the % go?
 
This is homework or an assignment, right?
 
Create a syntax diagram and make code to follow it.

http://www.horstmann.com/bigj2/slides/slides18.zip

here is the cleanest program to evaluate an arithmetic expression I have ever seen. Evaluator.java, it took me some time to figure it out exactly but it is worft it.
 
You have to definitively look up the operator's precedence orders. Usually this piece of information can be found in the chapter that describe integer operators. Certain operators have identical precedence orders. I would assign an integer precedence level value to each operator.
 
muna580 said:
Umm, I think this is the precedence order from highest to lowest: * / + -. Where does the % go?
If you mean the modulus operator in C, it has the same precedence as the '/' operator.

Good luck with the RPN, I might add. I wrote a set of C functions to do that parsing for me once. I'm still not happy with it, and have sunk weeks into it over the course of years (it probably didn't help that I was tryign to do something slightly different with it every time I reopened that particular can of worms).

The cheap and sleazy fix is to get the entire formula into a string, then build a binary tree from it by simply splitting the string on each precedence, with same same precedence from left to right, then splitting each substring on the next precedence, etc. That actually works pretty well. Matched delimiters affecting parsing (e.g., [], (), and "") are messy but not too bad.

The problem arises when you have multiline input. Cheap and sleazy no longer works. Then you have to do it the right way with a stack. That's when it gets messy.

Once you've got the tree, spitting out the RPN is obviously trivial.
 
I also had to write the same program in C (parse infix arithmetic expression and print postfix and prefix), I first wrote it in Java took me less than 30 mins, and then I tried to write it in C it took me about 7 hours to do it, I spend 3,5 hours searching for a bug it turned out that I allocated a struct wrongly, I could never have done such a mistake in Java, anyway, I am very pleased with my C program and specially with Java, one way is to do some elaborate substring work but that is a mess, there is an alternative way, you can do it recursively. Make a syntax diagram and follow it recursively, very hard to make a mistake then. Something like that

Code:
 /**
      Evaluates the expression.
      @return the value of the expression.
   */
   public Node getExpressionValue()
   {
      Node value = getTermValue();
      boolean done = false;
      while (!done)
      {
         String next = tokenizer.peekToken();
         if ("+".equals(next) || "-".equals(next))
         {
            tokenizer.nextToken(); // Discard "+" or "-"
            Node value2 = getTermValue();
            if ("+".equals(next)) value = new Node("+", value, value2);
            else value = new Node("-", value, value2);
         }
         else done = true;
      }
      return value;
   }

   /**
      Evaluates the next term found in the expression.
      @return the value of the term
   */
   public Node getTermValue()
   {
      Node value = getFactorValue();
      boolean done = false;
      while (!done)
      {
         String next = tokenizer.peekToken();
         if ("*".equals(next) || "/".equals(next))
         {
            tokenizer.nextToken();
            Node value2 = getFactorValue();
            if ("*".equals(next)) value = new Node("*", value, value2);
            else value = new Node("/", value, value2);
         }
         else done = true;
      }
      return value;
   }

   /**
      Evaluates the next factor found in the expression.
      @return the value of the factor
   */
   public Node getFactorValue()
   {
      Node value;
      String next = tokenizer.peekToken();
      if ("(".equals(next))
      {
         tokenizer.nextToken(); // Discard "("
         value = getExpressionValue();
         tokenizer.nextToken(); // Discard ")"
      }
      else
         value = new Node(tokenizer.nextToken());
      return value;
   }
 

Attachments

  • syntaxDiagrams.gif
    syntaxDiagrams.gif
    8.6 KB · Views: 608
Last edited:

Similar threads

  • · Replies 14 ·
Replies
14
Views
5K
  • · Replies 5 ·
Replies
5
Views
2K
Replies
4
Views
2K
  • · Replies 4 ·
Replies
4
Views
6K
  • · Replies 1 ·
Replies
1
Views
40K
  • · Replies 12 ·
Replies
12
Views
4K
  • · Replies 2 ·
Replies
2
Views
4K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 12 ·
Replies
12
Views
10K