일반적으로 재귀와 함께 할, 중첩의 다양한있을 것이기 때문에 표현은 문제를 관련.
재귀 주로 영업 E1에서 E2로 두 이루어지는 끝났
1. 괄호 또는 공간 E2 범위 재귀 용액 E1, E2와 E1을 찾아.
2. 직접 재귀 솔루션, 전자 재귀의 범위를 찾고 있습니다.
문제를 더 복잡하기 때문에, 직접 중첩 표현되므로 두 번째 방법을 알아 내기 어려운 브래킷 처리 동안 반복적 중첩 식의 처리와 같은 경계 조건. 시 스택을 빠져 나가는 입력시 때문에 범위 및 필요한 변수 값은, 재귀 푸시 스택을 기록 할 수있다.
아주 지루한, 에이하자 EXPR이 표현 될 수있다, 당신은 재귀 솔루션을 필요로하지만, getToken 만 특정 문자열 VI는 얻을 수 있습니다.
클래스 솔루션 { 공개 : 양단 큐 <unordered_map도 < 문자열 , INT >> 범위; INT 평가 ( 스트링 표현식) { INT의 POS = 0 ; 반환 평가 (발현을 POS); } INT의 평가 ( CONST 문자열 & S, INT 및 POS) { scopes.push_front (unordered_map도 < 문자열 , INT > ()); INT의 값 = 0 ; //전류가 expr 발을 리턴 하는 경우 (S [POS] == ' ( ' ) ++ POS; 문자열 토큰 = getToken (S, POS); // COUT << 토큰 << ENDL, 경우 (토큰 == " 추가 " ) { // 기대 "E1에서 E2)" INT E1 = 평가 (S, POS ++); // '이동 INT E2 = 평가 (S, ++ POS)를; 값 = E1 + E2; } 다른 경우 (토큰 == " MULT " ) { INT E1 = 평가 (S, POS ++); //'이동 INT E2 = 평가 (S, ++ POS)를; 값 = E1에서의 * E2; } 다른 경우 (토큰 == " 하자 " ) { //이 기대 "V1 V2 E1, E2 ... VN EN EXPR하자) ...." 상태를 (POS는 < s.size ()) { // 보낸 사람에게 EI는 것 VI 처리, 여기에만 VI 수 있거나 EXPR 경우 (S [++ POS] == ' ( ' ) { // expr이 표현식 (...) 인 경우 의 값 = 평가 (S, ++ POS), 휴식 ; } // VAR은 VI 또는 EXPR (가변 또는 INT의 EXPR) 일 수 문자열 VAR = getToken (S, POS); 경우 (S [POS] ==는 ' ) ' ) { // VAR은 EXPR는 경우 (isalpha에가 ( VAR은 [ 0 ])) // expr이 변수 값 = getValue ( VAR ); 다른 // EXPR은 INT의입니다 값 = stoi ( VAR ); 휴식 ; } // var에 지금 VI로 다음의 토큰을 읽고, VI입니다 scopes.front () [ VAR ] = 평가 (S, ++ POS); // COUT << VAR << "<-"<< scopes.front () [VAR] << ENDL; } } 다른 경우 (isalpha에 (토큰 [ 0 ])) { // 변수 값 = (토큰) getValue; } 다른 { // 숫자 값 = stoi (토큰); } 경우 (S [POS] == ' ) ' ) ++ POS; scopes.pop_front (); 반환 값을; } 문자열getToken ( CONST의 문자열 및 S, INT 및 POS) { 문자열 토큰 = "" ; 반면 (POS < s.size ()) { 경우 (S [POS] == ' ) ' || S는 [POS] == ' ' ) 분해 ; 토큰 + = S [POS ++ ]; } 반환 토큰; } int로 getValue ( 문자열 VAR ) { 에 대한 (자동 범위 : 범위를) { 경우 (scope.count ( VAR ))반환 범위 [ VAR를 ]; } 반환 0 ; } };