2009-05-01 4 views
1

에 따라 작은 부품으로 문자열 :분할 나는 형식의 문자열을 분석하기 위해 재귀를 사용하는 방법을 개발하기 위해 노력하고 자바를 사용하여 괄호

(PART0(PART1(PART2)(PART3))) 

나는 방법은 관련 문자열을 갈라 싶다. 나는 괄호가이 순서에 참여하지 않고 나에게 문자열의 각 부분에 대한 몇 가지 논리를 수행 할 수있는 기능을 제공하기 위해이 방법을 원하는 :

여기
PART2 
PART3 
PART1 
PART0 

내 방법은 현재 모습입니다 같은 :

private void check(String stmt) throws Exception { 

    System.out.println(stmt); 
    int firstIndex = 0; 
    int lastIndex = 0; 
    while(firstIndex !=-1){ 
     firstIndex = stmt.indexOf('('); 
     lastIndex = stmt.lastIndexOf(')'); 

     check(stmt.substring(firstIndex+1,lastIndex)); 

    } 
} 
여기

내 출력은 지금까지 무엇이다

(PART0(PART1(PART2)(PART3))) 
PART0(PART1(PART2)(PART3)) 
PART1(PART2)(PART3) 
PART2)(PART3 

기본적으로는이 부분에서 분해 : PART1 (PART2) (PART3)

더 우아한 방법이 있나요?

답변

11

중첩 된 컨텍스트는 자연스럽게 스택으로 작동합니다.

-Every 시간 새 컨텍스트 시작 (만남 '(') 푸시()

당신이 컨텍스트 (만남 ')'종료

-Every 시간) 팝()

- 각 팝업() 다음 전체 문맥에 해당됩니다

예 :

public static void main(String args[]) 
    { 
     String s = "(PART0(PART1(PART2)(PART3)))"; 
     Stack<StringBuilder> stack = new Stack<StringBuilder>(); 
     StringBuilder curr = null; 
     for (int i = 0; i < s.length(); i++) 
     { 
      char c = s.charAt(i); 
      if (c == '(') 
      { 
       curr = new StringBuilder(); 
       stack.push(curr); 
      } 
      else if (c == ')') 
      { 
       System.out.println(stack.pop()); 
      } 
      else 
      { 
       curr.append(c); 
      } 
     } 
    } 

당신은 아마로 밀거나 당신이있어 m를 팝업 할 상황이 존재하지 않는 경우 즉,뿐만 아니라 어떤 에러 체크를 추가 할 것 일치하지 않는 괄호 (형식이 잘못된 문자열).

관련 문제