///////// STACK 소스 코드를 이부분에 복사해서 붙임(ArrayStack or LinkedListSTack)
///////// 중위 표기를 후위 표기로 변환 시작
int getOpPrec(char op){
switch(op){
case '*':
case '/':
return 5;
case '+':
case '-':
return 3;
case '(':
return 1;
}
}
char* ConvToRPNExp(char exp[]) {
int expLen = strlen(exp);
char* convExp = (char *)malloc(expLen + 1);
memset(convExp, 0, sizeof(char)*expLen + 1);
int i;
int idx = 0;
char tok;
char op;
for(i=0; i<expLen; i++){
tok = exp[i];
if(isdigit(tok)){
convExp[idx++] = tok;
}
else{
switch(tok){
case '(':
push(tok);
break;
case ')':
while(1){
op = pop();
if(op == '(')
break;
convExp[idx++] = op;
}
break;
case '+':
case '-':
case '*':
case '/':
while(!isEmpty() && getOpPrec(peek()) >= getOpPrec(tok)){
convExp[idx++] = pop();
}
push(tok);
break;
}
}
}
while(!isEmpty()){
tok = pop();
if(tok != '('){
convExp[idx++] = tok;
}
}
return convExp;
}
///////// 중위 표기를 후위 표기로 변환 끝
///////// 후위 표기 계산기 시작
int EvalRPNExp(char exp[]) {
int expLen = strlen(exp);
int i;
char tok, op1, op2;
initStack();
for(i=0; i<expLen; i++){
tok = exp[i];
if(isdigit(tok)){
push(tok - '0'); //0의 ASCII코드(48), 1(49), 2(50) 2='2'-'0'
}
else{
op2 = pop();
op1 = pop();
switch(tok){
case '+':
push(op1 + op2);
break;
case '-':
push(op1 - op2);
break;
case '*':
push(op1 * op2);
break;
case '/':
push(op1 / op2);
break;
}
}
}
return pop();
}
///////// 후위 표기 계산기 끝
///////// 메인 함수
void main(){
//char exp[] = "1+2*3";
//char exp[] = "(1+2)*3";
char exp[] = "((1-2)+3*(5-2)";
char *convExp = ConvToRPNExp(exp);
printf("Infix : %s -> Postfix : %s, ", exp, convExp);
printf("Calculation : %d \n", EvalRPNExp(convExp));
free(convExp);
}