> For the complete documentation index, see [llms.txt](https://joshualbarb.gitbook.io/leetcode-problems/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://joshualbarb.gitbook.io/leetcode-problems/stack/basic-calculator-ii.md).

# Basic Calculator II

## Problem

Given a string `s` which represents an expression, *evaluate this expression and return its value*.&#x20;

The integer division should truncate toward zero.

(The difference between this and Basic Calculator I is that in here we have all the operands and no paranthese, while in Basic Calculator I we only had '+' and '-' and parantheses.)

![](/files/-MR1MpE85vHHQMVVABZo)

### Thought Process

* Multiplication and division need to be handled before addition and subtraction
* Once again here we are saving the previous sign like in Basic Calculator I

![](/files/-MR1O1c2La3_KHXvv5J9)

## Solution&#x20;

```
class Solution:
    def calculate(self, s: str) -> int:
        stack = []
        numbers = set("0123456789")
        num = 0
        operands = "*+-/"
        sign = '+'
        
        for i in range(len(s)):
            if s[i] in numbers:
                num = 10*num + int(s[i])
            
            if s[i] in operands or i == len(s)-1:
                if sign == '+':
                    stack.append(num)
                elif sign == '-':
                    num*=-1
                    stack.append(num)
                elif sign == '*':
                    prev = stack.pop()
                    stack.append(prev*num)
                elif sign == '/':
                    prev = stack.pop()
                    stack.append(int(prev/num))
                num = 0
                sign = s[i]
        
        return sum(stack)
                    
```

## Time Complexity

* **Time:** O(n)
* **Space:** O(n)
