동적할당과 스택 구조를 이용하여 후위 연산해보기!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Stack
{
int Data;
struct Stack * BeforeStack;
}Stack;
Stack *Top = NULL;
int Push(int Data)
{
Stack * StackData = (Stack *)calloc(1,sizeof(Stack));
if(StackData == NULL) exit(0);
StackData->Data = Data;
StackData->BeforeStack = NULL;
if(Top == NULL) Top = StackData;
else
{
StackData->BeforeStack = Top;
Top = StackData;
}
return 1;
}
int Pop(void)
{
int Data = 0;
if(Top == NULL)
{
printf("Not Data!!\n");
exit(0);
}
Data = Top->Data;
Top = Top->BeforeStack;
return Data;
}
int eval(char * String)
{
int cCount = 0;
int nData = 0;
int Number = 0;
int * Data = 0;
int PopData1 = 0;
int PopData2 = 0;
cCount = strlen(String);
for(Number=0; Number < cCount; Number++,String++)
{
if((*String) != '+' && (*String) != '-' && (*String) != '*' && (*String) != '/' )
{
nData = (*String) - '0';
if(Push(nData)) printf("Push Succese!\n");
}
else
{
PopData2 = Pop();
PopData1 = Pop();
switch(*String)
{
case '+':
if(Push(PopData1+PopData2)) printf("Push Succese!\n");
break;
case '-':
if(Push(PopData1-PopData2)) printf("Push Succese!\n");
break;
case '*':
if(Push(PopData1*PopData2)) printf("Push Succese!\n");
break;
case '/':
if(Push(PopData1/PopData2)) printf("Push Succese!\n");
break;
}
}
}
return Pop();
}
void main()
{
int result = 0;
printf("후위 표기식은 82/3-32*+\n");
result = eval("82/3-32*+");
printf("result : %d\n",result);
}
Top 구조체 포인터 변수가 상위를 가르킵니다~ 이를 이용하여 Push 함수에서 스택을 쌓고 POP 함수에서 스택을 꺼내는 구조입니다.