기본 계산기
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)"
가 유효함). 해결책:
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]
Reference
이 문제에 관하여(기본 계산기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/theabbie/basic-calculator-2df5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)