2012-10-09 1 views
0

다음은 중위 어를 후위 표현식으로 변환하는 cpp의 코드입니다. 모든 것을 시도했지만 코드가 원하는 결과를 얻지 못하고 있습니까? 누군가 제발 .... plzzzzzz 도와주세요.후행 표현식에 중위 어 표현식이 작동하지 않음

코드가 맞다고 생각하기는하지만 작동하지 않습니다. 이 코드를 확인하는 데 많은 시간을 할애하고 evry 라인 작업을 점검했지만 여전히 작동하지 않습니다.

#include <iostream> 
#include<conio.h> 
using namespace std; 

int k=-1,m=0; 
int j=0; 
string infi,postfi,operato; 
int precedence(char s) 
{ 
    switch(s) 
    { 

    case '+': 
    case '-':  
    return 1; 
    break; 
    case '*': 
    case '/':  
    return 2; 
    break; 
    case '$': 
    return 3; 
    break; 
    case '(': 
    return 4; 
    break; 
    case ')': 
    return 5; 
    break; 
    } 
} 
void operat() 
{ 
    if(k==-1) 
    { 

       k++; 
      operato[k]=infi[j]; 
      //cout<<operato[0]<<"mm"; 
    } 
    else if(precedence(infi[j])==4) 
    { 
      //cout<<"0000"; 
      k++; 
      operato[k]=infi[j]; 
    } 
    else if(precedence(infi[j])==5) 
    { 
      //cout<<"0000"; 
      while(operato[k]!='(') 
      { 
           postfi[m]=operato[k]; 
           m++; 
           k--; 
      } 
      k--; 
    } 
    else if(precedence(infi[j])>precedence(operato[k])) 
    { 
      //cout<<"0000"; 
      k++; 
      operato[k]=infi[j]; 
    } 
    else 
    { 
     //cout<<"0000"; 
     postfi[m]=operato[k]; 
     k--; 
     m++; 
     operat(); 
    } 
    //cout<<postfi[0]<<"pp"; 
} 

int main() 
{ 

    cin>>infi; 

    while(infi[j]!='\0') 
    { 
         if(infi[j]=='+'||infi[j]=='-'||infi[j]=='*'||infi[j]=='/'||infi[j]=='('||infi[j]==')'||infi[j]=='$') 
         { 
           operat(); 
           j++; 
         } 
         else 
         { 

          postfi[m]=infi[j]; 
          //cout<<postfi[0]; 
          //cout<<"me"<<m<<postfi[m]; 
          m++; 
          j++; 
         } 
    } 
    while(k!=-1) 
    { 
       postfi[m]=operato[k]; 
       //cout<<postfi[0]; 
       //cout<<"me"<<m; 
       //cout<<"meow"<<m<<postfi[m]; 
       k--; 
       m++; 
    } 
    //cout<<postfi[0]; 
    int g; 
    for(g=0;g<m;g++) 
    cout<<postfi[g]; 
    //getch(); 
    return(0); 
} 
+0

일반적인 제안은 코드별로 단계별로 진행하고 중단 점을 설정하여 진행 상황을 확인할 수있는 디버거를 사용해보십시오. – PherricOxide

+0

사실 나는 그 일을 시도하고 테스트 케이스 a + b를 확인하는 중에도 ab + 인 b +와 + 답이 아닌 올바른 답을 찾는다. – mohit

+0

출력 할 내용은 무엇입니까? 여기서 일반적인 목표는 무엇입니까? – M4rc

답변

1

내가 게시 한 내용만큼 원본을 그대로 유지 했으므로이를 준수 할 수있었습니다. 필요에 따라 수정하고, 최적화하지 않았으며, STL을 사용하지 않았습니다. STL을 사용하지 않으므로 숙제라고 생각하기 때문에 STL을 사용하지 않았습니다. 제대로 작동하는지 확인하기 위해 씁니다. 내가 말했듯이, 당신이 원하는 우선 순위를 얻으려면 그걸 가지고 놀아야 할 것이지만, 말했던 것처럼 그것은 기능적입니다. 또한 그것이 숙제 인 나의 가정에 대해서 : 나는 그것을 완수하지 않았고, 바라건대 올바른 방향으로 인도했다.

#include <iostream> 
#include<conio.h> 
using namespace std; 



int precedence(char s) 
{ 
    int rVal = -1; //Let's assume we didn't succeed 
    switch(s) 
    { 
    case '+': 
      rVal = 7; 
      break; 
    case '-': 
      rVal = 6; 
      break; 
    case '*': 
      rVal = 5; 
      break; 
    case '/': 
      rVal = 4; 
      break; 
    case '^': 
      rVal = 3; 
      break; 
    case '(': 
      rVal = 2; 
      break; 
    case ')': 
      rVal = 1; 
      break; 
    default: 
      break; 
    } 
    return rVal; //This satisfies the warning 
} 

char getpres(int num) 
{ 
    char rVal = 0; 
    switch(num) 
    { 
    case 7: 
      rVal = '+'; 
      break; 
    case 6: 
      rVal = '-'; 
      break; 
    case 5: 
      rVal = '*'; 
      break; 
    case 4: 
      rVal = '/'; 
      break; 
    case 3: 
      rVal = '^'; 
      break; 
    case 2: 
      rVal = '('; 
      break; 
    case 1: 
      rVal = ')'; 
      break; 
    default: 
      break; 
    } 
    return rVal; //This satisfies the warning 
} 

string reorder(string temp) 
{ 

    string rVal = "\0"; 
    int *array = new int[temp.length()]; 
    unsigned int d = 0; 
    for(unsigned int x = 0; x <= temp.length(); ++x) 
    { 
     array[x] = precedence(temp[x]); 
    } 

    for(unsigned int i = 0;i< temp.length() +1;i++) 
     { 
      for(unsigned int j = 1;j<i;j++) 
      { 
       if(array[i] > array[j]) 
       { 
        d = array[i]; //swap 

        array[i]=array[j]; 
        array[j]=d; 
       } 

      } 

     } 
     d = 0; 
     for(; d < temp.length(); ++d) 
     { 
      rVal += getpres(array[d]); 
     } 
     return rVal; 
} 

int main() 
{ 

    int itr=0; 
    string infi = "" ,postfi = "" ,operato = ""; 
    std::cin>>infi; 

    while(itr <= infi.length()) 
    { 
     if(precedence(infi[itr]) > -1) 
     { 
      operato += infi[itr]; 
     } 
     else 
     { 
      postfi += infi[itr]; 
     } 
     ++itr; 
    } 


    postfi += reorder(operato); 
    std::cout<<postfi<<std::endl; 
    return 0; 
} 
+0

미안하지만, 내가 뭘 사용했는지 (내가 틀렸을 수도 있음)와는 아주 다르므로 당신이하는 일을 이해할 수는 없다. 그러나 나는 정말로 그것을 이해할 수 없었다. 내 코드가 잘못 되었기 때문에 내 코드가 작동해야하지만 작동하지 않습니다 .. u를 할 수 있으면 도와주세요 .... 코드를 작성하는 데 시간을내어 주셔서 감사합니다 ... :) – mohit

+0

내가 수정 한 결과 당신의 스위치 진술서 당신이 특정 문자를 찾았을 때 컨트롤이 빠져 있습니다. 매우 이상한 조건에서 수정 된 전역 변수입니다. 과도한 루프 (특히 끝에 문자열을 인쇄 한 루프). 'infi [j]! = '\ 0''은'\ 0 '을 찾지 못하기 때문에 (나를 위해) 충돌 할 것입니다. 그 외, 문자열을 구문 분석하는 논리를 다시 확인하고 다른 사소한 것들만 제가 추가 한 유일한 것입니다 (오 우선 순위와 순서 우선 순위에 대한 버블 정렬) – M4rc

관련 문제