기본 표현식 결과를 찾을 하나의 기본 계산기를 생성한다고 가정합니다. 표현식은 여는 괄호와 닫는 괄호, 더하기 또는 빼기 기호 및 공백을 포함할 수 있습니다.
따라서 문자열이 "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