2015-01-15 2 views
2

나는 C++ leaner이고이 표현식에 대해 BST 트리를 만들려고합니다 : 2346 * +/8+, in-fix 버전을 얻으려면 inorder와 postorder, 그리고 postfix 버전의 표현. 표현식에 이진 트리를 만드는 데 어려움이 있습니다.산술 표현을위한 BST를 만드는 방법

Tree: 
Stack: 
inorder fn{} 
postorder fn{} 
main{ 
    input the file; 
    while(expression){ 
     if(digit){ 
     s.push} 
     else if(operator){ 
     s.top = right; 
     s.pop; 
     s.top = left; 
     s.pop; 
     T1 = new Tree(operator, left, right); 
    } 
    } 

내가 만들려는 나무가이 코드이

  + 
     /\ 
     (/) 8 
     /\ 
     + 2 
    /\ 
    * 3 
    /\ 
    4 6 

내 문제처럼 후 ((4 * 6) 트리, 내가 캔트 링크를 만들 수 있다는 것입니다 + : 여기 내 페소 코드 3)과 (4 * 6). 도와주세요. , some1

while(input_file >> expression){ 
    if(isdigit(expression[0])){ 
     sscanf(expression,"%c",&digit); 
     printf("reading a number: %c \n",digit); 
     Tree* s.push(digit); 
    } 
    else { 
     sscanf(expression,"%c",&oper); 
     printf("reading an operator: %c \n",oper); 
     T1 = new Tree(s.top(), NULL, NULL); 
     s.pop(); 
     T2 = new Tree(s.top(), NULL, NULL); 
     s.pop; 
     myTree = new Tree(oper, T1, T2); 
     s.push(myTree); 

나는 오류 메시지가 계속입니다 수 있습니다 드류 McGowen에

덕분에, 지금 난 다시 스택에 4 * 6 트리를 밀어입니다, 내 코드를 업데이트, 여기에 코드입니다 나를 위해 코드를 확인하십시오. 고마워.

안녕하세요, 주요 부분은 올바른 방향이라고 생각하지만 트리를 수락하려면 스택 함수를 어떻게 수정해야합니까? 여기 내 스택 함수입니다 :

void Stack::Push(char newthing) { 
index++; 
data[index] = newthing; 
} 
    void Stack::Pop() { 
    if (index > -1) { index--; } 
} 
char Stack::Top() { 
return data[index]; 
+1

Eh? 당신은 이미 표현의 후위 버전을 가지고 있습니다. 직접 평가할 수 있습니다. 나무를 만들거나 그 안에 중점을 도출 할 필요가 없습니다. – EJP

+0

'4 * 6' 트리를 만들고 나면 스택에 다시 밀어 넣으십시오. –

+0

네, 그렇지만, 루프를 한 번 더 실행하는 동안 4 * 6 트리 (newTree)를 스택으로 푸시하면 newTree가 새 트리의 오른쪽 하위가됩니다. while 루프를 사용하여 전체 트리를 만드는 방법을 찾아야합니다. 고마워, 너의 생각이 바른 길을 가리키고 있다고 생각해. – YHL

답변

1

스택에 숫자가 들어있는 것 같습니다. 수정 후 표기법에서 표현식을 스택으로 구문 분석하려면 스택에 트리 요소가 있어야합니다.

의사 코드 :

main{ 
    input the file; 
    while(expression){ 
     if(digit){ 
     s.push(new Tree(digit)); //create leaf-element 
     } 
     else if(operator){ 
     Tree tr = s.pop(); 
     Tree tl = s.pop(); 
     T1 = new Tree(operator,tl,tr); 
    } 
} 

이 또한 다소 그 모습 L (AL) R-파서 작품이다. 당신의 코드에 대한

: 당신은 스택에서 터지는 때문에 당신이 T2T1에 순서를 반대로해야

  • ;
  • T1T2은 간단한 팝업 조작이어야하며 생성자 호출이 없어야합니다.
  • 숫자 상자에 트리 노드 (잎)를 구성해야합니다. 식 트리의 루트 :

입력 스트림 (예를 들면하지 1+ 또는 12+6) 유효한 한 결과 하나 개의 원소와 스택 인 경우

while(input_file >> expression){ 
    if(isdigit(expression[0])){ 
     sscanf(expression,"%c",&digit); 
     printf("reading a number: %c \n",digit); 
     s.push(new Tree(digit,NULL,NULL)); //create new leaf 
    } 
    else { 
     sscanf(expression,"%c",&oper); 
     printf("reading an operator: %c \n",oper); 
     T2 = s.top(); //T2 instead of T1 and simple pop 
     s.pop(); 
     T1 = s.top(); //T1 instead of T2 and simple pop 
     s.pop; 
     myTree = new Tree(oper, T1, T2); 
     s.push(myTree); 
    } 
} 

.

+0

고마워, 그것은 나를 위해 작동합니다. – YHL

관련 문제