구현 된 후위표기법으로 이제 계산을 해보자
이전글에서 변환한 후위표현 식은 다음과 같다.
"51 8 3 4 * 4 - / - 20 -"
계산 방법은 다음과 같다.
1. 앞에서부터 SCAN 하면서 연산기호를 찾는다.
2. 연산 기호 앞에 2개의 숫자를 기호에 맞게 계산한다.
3. 다시 Stack에 집어 넣는다.
4. 연산 기호가 없을 때 까지 계산한다.
함수는 다음과 같다.
int Postfix_Calc(int *char_arr, int length)
{
int index;
int result;
int operator_0;
int operator_1;
Stack LStack, NStack;
StackInit(&LStack);
StackInit(&NStack);
/* 배열의 index 크기를 구한다. */
for (index = 0; char_arr[index] != 0; index++);
/* 배열을 끝에서 부터 Stack 에 옮긴다 */
while (index >= 0)
{
SPush(&LStack, char_arr[index--]);
}
/* 후위표현법으로 변경되어 저장된 Stack을 다음과 같이 처리한다..*/
while (LStack.stack_ptr != 0)
{
/*일반 숫자라면 Stack에 PUSH 한다.*/
if (SPeek(&LStack) != '*' && SPeek(&LStack) != '+'
&& SPeek(&LStack) != '-' && SPeek(&LStack) != '/')
{
SPush(&NStack, SPop(&LStack));
}
else
{
/*연산 부호라면 다음과 같이 계산한다.*/
switch (SPop(&LStack))
{
case '*':
operator_0 = SPop(&NStack);
operator_1 = SPop(&NStack);
result = operator_1 * operator_0;
SPush(&NStack, result);
break;
case '/':
operator_0 = SPop(&NStack);
operator_1 = SPop(&NStack);
result = operator_1 / operator_0;
SPush(&NStack, result);
break;
case '+':
operator_0 = SPop(&NStack);
operator_1 = SPop(&NStack);
result = operator_1 + operator_0;
SPush(&NStack, result);
break;
case '-':
operator_0 = SPop(&NStack);
operator_1 = SPop(&NStack);
result = operator_1 - operator_0;
SPush(&NStack, result);
break;
}
}
}
/*Stack Pointer가 1개 남았으면 마지막 결과 값이므로 그 값을 Return 한다. */
return SPop(&NStack);
}
함수 시작을 보면 Stack을 2개 만든다
1개는 식을 저장할 Stack(LStack)이고 다른 한개는 연산기호를 빼기 위해 빼놓은 숫자들을 저장하기 위한 Stack(NStack)이다.
연산기호가 나오면 연산기호는 제거하고 빼놓은 NStack에서 2개를 빼서 연산기호에 맞게 계산 후 다시 NStack에 저장한다.
Stack Pointer가 0이 될 때까지 계속 한다.
Main은 다음과 같이 하였다.
Main 함수
int main(void)
{
int length = 0;
memset(normal_array, 0, ARRAY_SIZE);
char *calc_equal =
{"51-8/(3*4-4)-20"};
length = STRtoINT(calc_equal, normal_array);
Postfix_func(normal_array, length);
printf("calc result is: %d \r\n", Postfix_Calc(normal_array, length));
}
실행 결과
'자료구조' 카테고리의 다른 글
Queue - LinkedList로 구현 (0) | 2020.11.24 |
---|---|
Queue - 배열 구현 (0) | 2020.11.23 |
Stack - 후위표기법 -1(변환) (0) | 2020.11.12 |
Stack - 중위표기법 (괄호 x) (0) | 2020.11.10 |
STACK 구현 (0) | 2020.10.22 |