기본 표현식 결과를 찾을 하나의 기본 계산기를 생성한다고 가정합니다. 표현식은 여는 괄호와 닫는 괄호, 더하기 또는 빼기 기호 및 공백을 포함할 수 있습니다.
따라서 문자열이 "5 + 2 - 3"과 같으면 결과는 7이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
ret :=0, 부호 :=1, num :=0, n :=s의 크기
-
하나의 스택 정의
-
i를 초기화하기 위해 :=0, i
-
i
크기의 배열 x =s를 정의합니다. -
x>='0'이고 x <='9'이면,
-
숫자 =숫자 * 10
-
숫자 =숫자 + (x - '0')
-
-
그렇지 않으면 x가 '('와 같을 때 -
-
ret =ret + (기호 * 숫자)
-
st에 ret 삽입
-
st에 기호 삽입
-
ret :=0, 부호 :=1, 숫자 :=0
-
-
그렇지 않으면 x가 ')'와 같을 때 -
-
ret =ret + (기호 * 숫자), 부호 :=1, 숫자 :=0
-
ret =ret * st의 최상위 요소
-
st에서 항목 삭제
-
ret =ret + st의 최상위 요소
-
st에서 항목 삭제
-
-
그렇지 않으면 x가 '+'와 같을 때 -
-
ret =ret + (기호 * 숫자), 부호 :=1, 숫자 :=0
-
-
그렇지 않으면 x가 '-'와 같을 때 -
-
ret =ret + (기호 * 숫자), 부호 :=- 1, 숫자 :=0
-
-
-
num이 0이 아니면
-
렛 =렛 + 부호 * 숫자
-
-
리턴 렛
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; class Solution { public: int calculate(string s) { int ret = 0; int sign = 1; int num = 0; int n = s.size(); stack <int> st; for(int i = 0; i < n; ++i){ char x = s[i]; if(x >= '0' && x <= '9'){ num *= 10; num += (x - '0'); } else if(x == '('){ ret += (sign * num); st.push(ret); st.push(sign); ret = 0; sign = 1; num = 0; } else if(x == ')'){ ret += (sign * num); sign = 1; num = 0; ret *= st.top(); st.pop(); ret += st.top(); st.pop(); } else if(x == '+'){ ret += (sign * num); sign = 1; num = 0; } else if(x == '-'){ ret += (sign * num); sign = -1; num = 0; } } if(num){ ret += sign * num; } return ret; } }; main(){ Solution ob; cout << (ob.calculate("5 + 2 - 3")); }
입력
"5 + 2 - 3"
출력
4