2016-09-08 13 views
-1

접두사와 접미사로 중위 표기법을 변환하는 간단한 프로그램을 작성하려고합니다. 지금까지 postfix는 완벽하게 작동합니다. 그러나, 나는 접두사 변환 권리를 얻는 것처럼 보일 수 없다. 나는 둘 다 shunting 야드 알고리즘을 사용했습니다. 내 코드가 약간 이상하다면 (예 : #include를 사용하는 대신 내 자신의 스택 클래스 작성, 불필요하게 다른 것들을 사용하는) 사전에 사과하십시오. 할당 요구 사항 (대학 과제 임)을 충족해야합니다. 여기에 지금까지 시도한 작업은 다음과 같습니다접두사를 접두사로 바꾸는 C++?

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

const int Max=255; 
class Stack 
{ 
private: 
    char element[Max]; 
    int top; 
public: 
    Stack() 
    { 
     top=-1; 
    } 
    bool isFull() 
    { 
     if(top>=(Max-1)) return true; 
     else return false; 
    } 
    bool isEmpty() 
    { 
     if(top==-1) return true; 
     else return false; 
    } 
    bool push(char x) 
    { 
     if(!isFull()) 
     { 
      top++; 
      element[top]=x; 
      return true; 
     } 
     else 
     { 
      cout<<"Stack is full"<<endl; 
      return false; 
     } 
    } 
    bool pop(char &x) 
    { 
     if(!isEmpty()) 
     { 
      x=element[top--]; 
      return true; 
     } 
     else 
     { 
      //cout<<"Stack is empty"<<endl; 
      return false; 
     } 
    } 
    char retrieve() 
    { 
     if(!isEmpty()) 
     { 
      return element[top]; 
     } 
     else 
     { 
      //cout<<"Stack is empty"<<endl; 
      return ' '; 
     } 
    } 
}; 


class Converter 
{ 
private: 
public: 
    Converter(){} 
    bool isOperator(char x) 
    { 
     if(x=='+'||x=='-'||x=='*'||x=='/'||x=='^'||x=='('||x==')') return true; 
     else return false; 
    } 
    bool isOperand(char x) 
    { 
     if(x>='0'&&x<='9') return true; 
     else return false; 
    } 
    int Hierarchy(char x) 
    { 
     if(x=='+'||x=='-') return 1; 
     else if(x=='*'||x=='/') return 2; 
     else if(x=='^') return 3; 
     else return 0; 
    } 
    char*ToPostfix(char infix[]) 
    { 
     Stack stack1; 
     char res[20]; 
     int resindex=0; 
     for(int i=0;i<strlen(infix);i++) 
     { 
      if(isOperator(infix[i])) 
      { 
       if(infix[i]=='(') 
       { 
        stack1.push(infix[i]); 
       } 
       else if(infix[i]==')') 
       { 
        while(stack1.retrieve()!='(') 
        { 
         stack1.pop(res[resindex++]); 
        } 
        stack1.pop(res[resindex]); 
       } 
       else 
       { 
        while(Hierarchy(infix[i])<=Hierarchy(stack1.retrieve())) 
        { 
         stack1.pop(res[resindex++]); 
        } 
        stack1.push(infix[i]); 
       } 
      } 
      else if(isOperand(infix[i])) 
      { 
       res[resindex++]=infix[i]; 
      } 
     } 
     while(!stack1.isEmpty()) 
     { 
      stack1.pop(res[resindex++]); 
     } 
     res[resindex]='\0'; 
     return res; 
    } 
    char*ToPrefix(char infix[]) 
    { 
     char res[20]; 
     strcpy(res,strrev(infix)); 
     for(int i=0;i<strlen(res);i++) 
     { 
      if(res[i]=='(') 
      { 
       res[i]=')'; 
      } 
      else if(res[i]==')') 
      { 
       res[i]='('; 
      } 
     } 
     strcpy(res,ToPostfix(res)); 
     strcpy(res,strrev(res)); 
     return res; 
    } 
}; 
int main() 
{ 
    Converter convert; 
    char infix[20]; 
    cout<<"Enter infix expression: "; 
    cin>>infix; 
    cout<<endl<<"Prefix: "<<convert.ToPrefix(infix)<<endl; 
    cout<<"Postfix: "<<convert.ToPostfix(infix)<<endl; 
    return 0; 
} 

나는 간단한 중위 표기법을 변환하려고, 즉 (1) *, 후위 변환 잘^5-6/4 (2 3 +) (123 + * 45 ^/6-) 접두어 변환은 -/* 1 + 23^456 대신 잘못된 대답 (- * 1/+ 23^456)을 반환합니다. 누구든지 도와 줄 수 있습니까?

+2

디버거를 사용하여 코드를 단계별로 실행하는 방법을 배워야 할 수도 있습니다. 좋은 디버거를 사용하면 한 줄씩 프로그램을 실행하고 예상 한 곳에서 벗어난 곳을 볼 수 있습니다. 프로그래밍을 할 때 필수적인 도구입니다. 추가 읽기 : ** [작은 프로그램을 디버깅하는 방법] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+0

@ NathanOliver이 20 번 이상 디버깅했습니다. 지난 2 시간 동안 프리픽스 알고리즘이 잘못 될 수 있다는 것을 알아 내지 못했지만 나는봤을 때 아무 것도 찾을 수 없었습니다. 어리 석고 필사적이라면 정말 미안해. – Penny

답변

1

사실 곱셈이 중위 어에서 오는 경우 나누기 및 곱셈의 순서를 전환 할 수 있기 때문에 두 대답이 모두 정확합니다. 따라서이 경우 잘못된 답이 맞습니다. 그러나 왼쪽에서 오른쪽으로 우선 순위가 있으므로 계층 처리가 올바르지 않습니다. change else if(x=='*'||x=='/') return 2;.

+0

잘 모르겠지만, 코드를 다시 살펴본 후에, (계층 구조 (접미사 [i]) <= 계층 구조 (스택 1.retrieve() (계층 구조 (stack1.retrieve()))'('<'''<')는 *와/그리고 +와 -에 대해 왼쪽에서 오른쪽으로 유지하기위한 트릭을 수행 할 수 있습니다. – stefaanv