<p>Given a string <code>s</code> which represents an expression, <em>evaluate this expression and return its value</em>.&nbsp;</p>

<p>The integer division should truncate toward zero.</p>

<p>You may assume that the given expression is always valid. All intermediate results will be in the range of <code>[-2<sup>31</sup>, 2<sup>31</sup> - 1]</code>.</p>

<p><strong>Note:</strong> You are not allowed to use any built-in function which evaluates strings as mathematical expressions, such as <code>eval()</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<pre><strong>Input:</strong> s = "3+2*2"
<strong>Output:</strong> 7
</pre><p><strong class="example">Example 2:</strong></p>
<pre><strong>Input:</strong> s = " 3/2 "
<strong>Output:</strong> 1
</pre><p><strong class="example">Example 3:</strong></p>
<pre><strong>Input:</strong> s = " 3+5 / 2 "
<strong>Output:</strong> 5
</pre>
<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= s.length &lt;= 3 * 10<sup>5</sup></code></li>
	<li><code>s</code> consists of integers and operators <code>(&#39;+&#39;, &#39;-&#39;, &#39;*&#39;, &#39;/&#39;)</code> separated by some number of spaces.</li>
	<li><code>s</code> represents <strong>a valid expression</strong>.</li>
	<li>All the integers in the expression are non-negative integers in the range <code>[0, 2<sup>31</sup> - 1]</code>.</li>
	<li>The answer is <strong>guaranteed</strong> to fit in a <strong>32-bit integer</strong>.</li>
</ul>

class Solution:
    precedence_stack = {
        '(': 0,
        '+': 2,
        '-': 2,
        '*': 4,
        '/': 4,
        'neg': 5,
    }

    precedence_input = {
        '(': 6,
        ')': 0,
        '+': 1,
        '-': 1,
        '*': 3,
        '/': 3,
        'neg': 5,
    }

    operators = set("+-*/")

    def transform(self, s):
        # The generated postfix expression of s
        output = []
        # Wrap `s` with '(' and ')' to make processing easier
        s = s + ')'
        stack = ['(']
        prevC = '('

        hasNum = False
        num = 0
        for c in s:
            if c == ' ':
                continue

            # c is part of number
            if c.isdigit():
                hasNum = True
                num = num * 10 + int(c)
                prevC = c
                continue
            # c is operator
            if hasNum:
                hasNum = False
                output.append(num)
                num = 0

            # check if is negative unary operator
            if c == '-' and (prevC == '(' or prevC in self.operators):
                c = 'neg'
            
            # Pop until '('
            while self.precedence_stack[stack[-1]] >= self.precedence_input[c]:
                popped = stack.pop()
                if popped != '(':
                    output.append(popped)
                else:
                    break
            # push input on to the stack
            if c != ')':
                stack.append(c)

            prevC = c
        
        return output

    def evaluate_postfix(self, postfix):
        stack = []

        for each in postfix:
            # Is number
            if each not in self.precedence_input:
                stack.append(each)
                continue

            # Is operator
            if each == '+':
                stack.append(stack.pop() + stack.pop())
            elif each == '-':
                a, b = stack.pop(), stack.pop()
                stack.append(b - a)
            elif each == '*':
                stack.append(stack.pop() * stack.pop())
            elif each == '/':
                a, b = stack.pop(), stack.pop()
                stack.append(int(b / a)) # truncate towards zero
            elif each == 'neg':
                stack.append(-stack.pop())

        return stack[0]

    def calculate(self, s):
        postfix = self.transform(s)
        return self.evaluate_postfix(postfix)
22300