LeetCode 736 구문 분석 리스프 식

일반적으로 재귀와 함께 할, 중첩의 다양한있을 것이기 때문에 표현은 문제를 관련.

재귀 주로 영업 E1에서 E2로 두 이루어지는 끝났

1. 괄호 또는 공간 E2 범위 재귀 용액 E1, E2와 E1을 찾아.

2. 직접 재귀 솔루션, 전자 재귀의 범위를 찾고 있습니다.

 

문제를 더 복잡하기 때문에, 직접 중첩 표현되므로 두 번째 방법을 알아 내기 어려운 브래킷 처리 동안 반복적 중첩 식의 처리와 같은 경계 조건. 시 스택을 빠져 나가는 입력시 때문에 범위 및 필요한 변수 값은, 재귀 푸시 스택을 기록 할 수있다.

아주 지루한, 에이하자 EXPR이 표현 될 수있다, 당신은 재귀 솔루션을 필요로하지만, getToken 만 특정 문자열 VI는 얻을 수 있습니다.

클래스 솔루션 {
 공개 : 
    양단 큐 <unordered_map도 < 문자열 , INT >> 범위; 
    
    INT 평가 ( 스트링 표현식) {
         INT의 POS = 0 ;
        반환 평가 (발현을 POS); 
    } 
    
    INT의 평가 ( CONST  문자열 & S, INTPOS) { 
        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, INTPOS) {
         문자열 토큰 = "" ;
        반면 (POS < s.size ()) {
             경우 (S [POS] == ' ) ' || S는 [POS] == '  ' ) 분해 ; 
            토큰 + = S [POS ++ ]; 
        } 
        반환 토큰; 
    } 
    
    int로 getValue ( 문자열  VAR ) {
         에 대한 (자동 범위 : 범위를) {
             경우 (scope.count ( VAR ))반환 범위 [ VAR를 ]; 
        } 
        반환  0 ; 
    } 
};

 

추천

출처www.cnblogs.com/hankunyan/p/11184109.html