본문 바로가기

IT/C

Infix -> postfix 변환 C source

//*
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define STACK_SIZE 50

int push(char* stack, int* top, char value);
int pop(char* stack, int *top, char *value);
int Change_to_post(char* stack, char* str, int *top);//infix -> postfix
int Cal_post(char* stack, int *top);

main()
{
char stack[50];//스택
char str[50];//입력 배열
int top=0;
int error_f=0; // 에러시 리턴값 저장

int length;
int i;
int j;

double start, finish;


start = clock();

printf("수식을 입력하시오 : ");
scanf("%s", &str);

error_f = Change_to_post(stack, str, &top);
if(error_f == 1)//함수내에서 1을 반환시 종료
return 1;

//자리수 구분 정리
length = strlen(stack);
for(i = 0, j=0; i<length; i++, j++)
{
if(stack[i] == ' ' && stack[i+1] == ' ')
{
str[j] = ' ';
str[j+1] = 0;
}

if(stack[i] == ' ' && stack[i+1] != ' ')
j--;

else
{
str[j] = stack[i];
str[j+1] = 0;
}
}

printf("변환된 posfix 수식 : ");
length = strlen(str);
for(i = 0; i<length; i++)
{
printf("%c",str[i]);
}
printf("\n\n");

Cal_post(str, &top);

finish =clock();
printf("소요시간 : %f\n",(finish-start) / (double)CLOCKS_PER_SEC );

}
int Cal_post(char* stack, int *top)
{
int i = 0;//stack
int j = 0;//in_stack
int in_stack[50];

while(1)
{
if(stack[i] == 0)
break;

if(stack[i] >= 48 && stack[i] <= 57)
{
in_stack[j] = stack[i] - 48;

if(stack[i+1] >= 48 && stack[i+1] <= 57)
{
in_stack[j] = (in_stack[j]*10) + (stack[i+1] - 48);
i++;
}
}

else if(stack[i] == ' ')
{
j--;
}

else if(stack[i] == '*' || stack[i] == '/' || stack[i] == '+' || stack[i] == '-')
{
if(stack[i] == '*')
{
in_stack[j-2] = in_stack[j-2] * in_stack[j-1];
j = j-2;
}

else if(stack[i] == '/')
{
in_stack[j-2] = in_stack[j-2] / in_stack[j-1];
j = j-2;
}

else if(stack[i] == '+')
{
in_stack[j-2] = in_stack[j-2] + in_stack[j-1];
j = j-2;
}

else if(stack[i] == '-')
{
in_stack[j-2] = in_stack[j-2] - in_stack[j-1];
j = j-2;
}
}

i++;
j++;
}

printf("계산 결과는 %d 입니다 \n", in_stack[0]);

return 0;

}

int Change_to_post(char* stack, char* str, int *top)
{
int i=0;

char ins_stack[50];//명렁어 저장하는 스택
int ins_top=0;//명령어용 top

int error_f=0; // 에러시 리턴값 저장
char char_temp;

char emp = ' ';// 자리수 구분위한 공백

while(1)
{
if(str[i] == 0)
{
while(1)
{
if(ins_top<0)
{
stack[(*top)-1] = 0;
return 0;
}
else
{
error_f = pop(ins_stack, &ins_top, &char_temp);
if(error_f == 1)//pop에서 1을 반환시 종료
return 1;

error_f = push(stack, top, char_temp);
if(error_f == 1)//push에서 1을 반환시 종료
return 1;
}
}
}

else if(str[i] >= 48 && str[i] <= 57)
{
error_f = push(stack, top, str[i]);//피연산자 일때
if(error_f == 1)//push에서 1을 반환시 종료
return 1;
}

else if(str[i] == '*' || str[i] == '/' || str[i] == '+'
|| str[i] == '-' || str[i] == '(' || str[i] == ')')//연산자 일때
{
if((str[i] == '+' || str[i] == '-') && (ins_stack[ins_top-1] == '*'
|| ins_stack[ins_top-1] == '/'))//우선순위 낮을때
{
error_f = pop(ins_stack, &ins_top, &char_temp);
if(error_f == 1)//pop에서 1을 반환시 종료
return 1;

error_f = push(stack, top, char_temp);
if(error_f == 1)//push에서 1을 반환시 종료
return 1;

error_f = push(ins_stack, &ins_top, str[i]);
if(error_f == 1)//push에서 1을 반환시 종료
return 1;
}

else if(str[i] == ')')// 괄호가 끝났을때
{
while(1)
{
if(ins_stack[ins_top-1] == '(')//여는 괄호가 나오면 종료
{
error_f = pop(ins_stack, &ins_top, &char_temp);
if(error_f == 1)//pop에서 1을 반환시 종료
return 1;

break;
}
else//명령어 스택에서 일반 스택으로 이동
{
error_f = pop(ins_stack, &ins_top, &char_temp);
if(error_f == 1)//pop에서 1을 반환시 종료
return 1;

error_f = push(stack, top, char_temp);
if(error_f == 1)//push에서 1을 반환시 종료
return 1;
}
}
}

else //우선순위 낮을때
{
error_f = push(ins_stack, &ins_top, str[i]);
if(error_f == 1)//push에서 1을 반환시 종료
return 1;
}
}//연산자 else if end

else//이 외의 값들 입력시
{
printf("올바르지 않은 형식의 값이 입력되었습니다 \n");
return 1;
}

error_f = push(stack, top, emp);//공백
if(error_f == 1)//push에서 1을 반환시 종료
return 1;

i++;

}//while end
}//fuction end

int push(char* stack, int* top, char value)
{

if(*top >= STACK_SIZE)
{
printf("input's size is over the range \n");
return 1;
}


stack[*top] = value;
(*top)++;

return 0;
}

int pop(char* stack, int *top, char *value)
{
if(*top < 0)
{
printf("no more data in stack \n");
return 1;
}

(*top)--;
*value = stack[*top];

return 0;
}
//*/

 

infixTOpostfix.c