접두사와 접미사로 중위 표기법을 변환하는 간단한 프로그램을 작성하려고합니다. 지금까지 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)을 반환합니다. 누구든지 도와 줄 수 있습니까?
디버거를 사용하여 코드를 단계별로 실행하는 방법을 배워야 할 수도 있습니다. 좋은 디버거를 사용하면 한 줄씩 프로그램을 실행하고 예상 한 곳에서 벗어난 곳을 볼 수 있습니다. 프로그래밍을 할 때 필수적인 도구입니다. 추가 읽기 : ** [작은 프로그램을 디버깅하는 방법] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver
@ NathanOliver이 20 번 이상 디버깅했습니다. 지난 2 시간 동안 프리픽스 알고리즘이 잘못 될 수 있다는 것을 알아 내지 못했지만 나는봤을 때 아무 것도 찾을 수 없었습니다. 어리 석고 필사적이라면 정말 미안해. – Penny