title: Handling parenthesis while converting infix expressions to postfix expressions
body: <p>I'm working on a project in Java that requires me to convert an infix expression to a postfix expression. I am currently able to convert infix expressions to postfix with this method as long as they don't contain parenthesis, but I can't figure out how to handle parenthesis. </p>
  
  <p>Basically, I have two stacks that hold objects that are called 'Token'. A Token is a wrapper class that holds a string that is either a number, variable (which gets evaluated as a number, pending on user input), operator (the operator has a priority level associated with it so that my method can determine how to handle order of operations between '+', '-', '*' and '/'), or a parenthesis (the parenthesis has a way to determine if it is a open parenthesis or a closed parenthesis).</p>
  
  <p>How should I handle parenthesis? What about multiple layers of parenthesis?</p>
  
  <pre><code>public String toPostFix() {
      StringBuilder postfixstr = new StringBuilder();
  
      Stack&lt;Token&gt; in_fix = new Stack&lt;&gt;();
      Stack&lt;Token&gt; post_fix = new Stack&lt;&gt;();
  
      for (int i = tokens.length - 1; i &gt;= 0; i--) {
          t = new Token(tokens[i]);
          in_fix.push(t);
      }
  
      //there are still tokens to process
      while (!in_fix.empty()) {
          //is a number
          if (in_fix.peek().type == 1) {     
              postfixstr.append(in_fix.pop().toString());
          } 
  
          //is an operator and the stack is empty
          else if (in_fix.peek().type == 3 &amp;&amp; post_fix.empty()) {   
              post_fix.push(in_fix.pop());
          } 
  
          // is an operator that has higher priority than the operator on the stack
          else if (in_fix.peek().type == 3 &amp;&amp; in_fix.peek().isOperator() &gt; post_fix.peek().isOperator()) {
              post_fix.push(in_fix.pop());
          } 
  
          // is an operator that has lower priority than the operator on the stack
          else if (in_fix.peek().type == 3 &amp;&amp; in_fix.peek().isOperator() &lt;= post_fix.peek().isOperator()) {
              postfixstr.append(post_fix.pop());
              post_fix.push(in_fix.pop());
          } 
  
          //puts the rest of the stack onto the output string
          if (in_fix.empty()) {
              while (!post_fix.empty()) {
                  postfixstr.append(post_fix.pop());
              }
          }
      }
  
      return postfixstr.toString();
  }
  </code></pre>