기초계산기Ⅱ

2213 단어 theabbieleetcodedsa
표현식을 나타내는 문자열s이 주어지면 이 표현식을 평가하고 해당 값을 반환합니다.

정수 나누기는 0을 향해 잘려야 합니다.

주어진 표현식이 항상 유효하다고 가정할 수 있습니다. 모든 중간 결과는 [-231, 231 - 1] 범위에 있습니다.

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

예 1:

입력: s = "3+2*2"
출력: 7

예 2:

입력: s = "3/2 "
출력: 1

예 3:

입력: s = "3+5/2 "
출력: 5

제약:
  • 1 <= s.length <= 3 * 105
  • s는 몇 개의 공백으로 구분된 정수와 연산자('+', '-', '*', '/')로 구성됩니다.
  • s는 유효한 식을 나타냅니다.
  • 식의 모든 정수는 [0, 231 - 1] 범위의 음수가 아닌 정수입니다.
  • 답은 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
            }
            numstack = []
            opstack = []
            chunk = ""
            for c in s:
                if c == " " or c in precedence:
                    if len(chunk) > 0:
                        numstack.append(int(chunk))
                        chunk = ""
                    if c in precedence:
                        while len(opstack) > 0 and precedence[opstack[-1]] >= precedence[c]:
                            currop = opstack.pop()
                            b = numstack.pop()
                            a = numstack.pop()
                            res = self.eval(a, currop, b)
                            numstack.append(res)
                        opstack.append(c)
                else:
                    chunk += c
            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]
    

    좋은 웹페이지 즐겨찾기