기본 계산기

3355 단어 theabbieleetcodedsa
유효한 표현식을 나타내는 문자열s이 주어지면 기본 계산기를 구현하여 이를 평가하고 평가 결과를 반환합니다.

참고: eval() 와 같이 문자열을 수학 표현식으로 평가하는 내장 함수를 사용할 수 없습니다.

예 1:

입력: s = "1 + 1"
출력: 2

예 2:

입력: s = "2-1 + 2 "
출력: 3

예 3:

입력: s = "(1+(4+5+2)-3)+(6+8)"
출력: 23

제약:
  • 1 <= s.length <= 3 * 105
  • s'+' , '-' , '(' , ')'' ' 의 숫자로 구성됩니다.
  • s는 유효한 식을 나타냅니다.
  • '+'는 단항 연산으로 사용되지 않습니다(즉, "+1""+(2 + 3)"는 유효하지 않음).
  • '-'는 단항 연산으로 사용될 수 있습니다(즉, "-1""-(2 + 3)"가 유효함).
  • 입력에 두 개의 연속 연산자가 없습니다.
  • 모든 숫자와 실행 중인 계산은 부호 있는 32비트 정수에 맞습니다.

  • 해결책:

    class Solution:
        def eval(self, a, op, b):
            if op == '+':
                return a + b
            elif op == '-':
                return a - b
            elif op == '/':
                return int(a / b)
            elif op == '*':
                return a * b
    
        def calculate(self, s: str) -> int:
            s += " "
            precedence = {
                '*': 1,
                '/': 1,
                '+': 0,
                '-': 0
            }
            brackets = {
                '(': 1,
                ')': -1
            }
            numstack = []
            opstack = []
            chunk = ""
            latestOpenBracket = True
            for c in s:
                if c == " " or c in precedence or c in brackets:
                    if len(chunk) > 0:
                        numstack.append(int(chunk))
                        chunk = ""
                    if c in brackets:
                        if brackets[c] == 1:
                            opstack.append('(')
                            latestOpenBracket = True
                        elif brackets[c] == -1:
                            latestOpenBracket = False
                            while opstack[-1] != '(':
                                currop = opstack.pop()
                                b = numstack.pop()
                                a = numstack.pop()
                                res = self.eval(a, currop, b)
                                numstack.append(res)
                            opstack.pop()
                    elif c in precedence:
                        if latestOpenBracket:
                            numstack.append(0)
                        while len(opstack) > 0 and precedence.get(opstack[-1], -1) >= precedence[c]:
                            currop = opstack.pop()
                            b = numstack.pop()
                            a = numstack.pop()
                            res = self.eval(a, currop, b)
                            numstack.append(res)
                        opstack.append(c)
                        latestOpenBracket = False
                else:
                    chunk += c
                    latestOpenBracket = False
            while len(opstack) > 0:
                currop = opstack.pop()
                b = numstack.pop()
                a = numstack.pop()
                res = self.eval(a, currop, b)
                numstack.append(res)
            return numstack[0]
    

    좋은 웹페이지 즐겨찾기