title: Stack calculator (postfix, Python)
body: <p>The question I'm having problem on is calculating the postfix form expressions: for example, (1, 2, '+', 3, '*'). </p>
  
  <p>By calculating the expression using the following algorithm:
  1. If the expression only contains an integer, return that integer.
  2. Otherwise, maintain a stack. Loop through the tuple and push every element to the stack. If the element is an operator, pop the first two element out of the stack, calculate the result and push the result into the stack. 
  To illustrate, we take the example above. Initially, the stack is empty.
  The test case is </p>
  
  <pre><code>calculate((1, 2, '*', 3, '-', 2, '*', 5, '+'))  
  3
  </code></pre>
  
  <p>whereas my first code was no good (hardcoded and all >&lt; ):</p>
  
  <pre><code>def calculate(inputs):
      if len(inputs) ==1:
          return inputs[0]
      elif len(inputs) == 5:
          s= []
          push_stack(s, inputs[0])
          push_stack(s, inputs[1])
          if inputs[2] == '*':
              A = s.pop() * s.pop()
          elif inputs[2] == '+':
              A = s.pop() + s.pop()
          elif inputs[2] == '-':
              A= s.pop() - s.pop()
          elif inputs[2] == '/':
              A = s.pop() / s.pop()
          s.clear()
          s= [A]
          push_stack(s, inputs[3])
          if inputs[4] == '*':
              A = s.pop() * s.pop()
          elif inputs[4] == '+':
              A = s.pop() + s.pop()
          elif inputs[4] == '-':
              A= s.pop() - s.pop()
          elif inputs[4] == '/':
              A = s.pop() / s.pop()
          return A
      else:
          s= []
          push_stack(s, inputs[0])
              push_stack(s, inputs[1])
          if inputs[2] == '*':
              A = s.pop() * s.pop()
          elif inputs[2] == '+':
              A = s.pop() + s.pop()
          elif inputs[2] == '-':
              A= s.pop() - s.pop()
          elif inputs[2] == '/':
              A = s.pop() / s.pop()
          s.clear()
          s= [A]
          push_stack(s, inputs[3])
          if inputs[4] == '*':
              A = s.pop() * s.pop()
          elif inputs[4] == '+':
              A = s.pop() + s.pop()
          elif inputs[4] == '-':
              A= s.pop() - s.pop()
          elif inputs[4] == '/':
              A = s.pop() / s.pop()
          s.clear()
          s= [A]
          push_stack(s, inputs[5])
          if inputs[6] == '*':
              A = s.pop() * s.pop()
          elif inputs[6] == '+':
              A = s.pop() + s.pop()
          elif inputs[6] == '-':
              A= s.pop() - s.pop()
          elif inputs[6] == '/':
              A = s.pop() / s.pop()
          s.clear()
          s= [A]
          push_stack(s, inputs[7])
          if inputs[8] == '*':
              A = s.pop() * s.pop()
          elif inputs[8] == '+':
              A = s.pop() + s.pop()
          elif inputs[8] == '-':
              A= s.pop() - s.pop()
          elif inputs[8] == '/':
              A = s.pop() / s.pop()
          return A
  </code></pre>
  
  <p>Sorry for making you read that! Then I changed the style to</p>
  
  <pre><code>def calculate(inputs):
      if len(inputs) ==1:
          return inputs[0]
      else:
          s =[]
          for i in inputs:
              if type(i) == int:
                  return push_stack(s, i)
              elif i is '*' or '/' or 'x' or '+':
                  A = s.pop()
                  B =s.pop()
                  know = operator(i, A, B)
                  C = push_stack(s, know)
          return C
  
  def operator(sign, one, two):
      if sign == '*':
          A = one * two
      elif sign == '+':
          A = one + two
      elif sign == '-':
          A= one - two
      elif sign == '/':
          A = one / two
      return A
  </code></pre>
  
  <p>Am I getting closer to the idea and how does my code improve?</p>
  
  <p>** Edit **
  Using IDLE:</p>
  
  <pre><code>&gt;&gt;&gt; calculate((1, 2, '*', 3, '-'))
  [1]
  &gt;&gt;&gt; calculate((1, 2, '+', 3, '*'))
  [1]
  &gt;&gt;&gt; calculate((1, 2, '*', 3, '-', 2, '*', 5, '+'))
  [1]
  </code></pre>
  
  <p>which is not the answer I'm looking for. It should be 1 then 9 then 3.</p>