//*
#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;
}
//*/
'IT > C' 카테고리의 다른 글
Logic and Computer Design Fundamentals 3th Solutions (0) | 2013.01.11 |
---|---|
tiny BASIC interpreter C source - 다차원 배열 추가 (0) | 2013.01.11 |
tiny BASIC interpreter C source (0) | 2013.01.11 |
DFS Traversal Algorithm C source (0) | 2013.01.11 |
Euclide & non Euclide gcd algorithm C source (0) | 2013.01.11 |