Soft Ware/자료구조 및 알고리즘

동적할당과 스택 구조를 이용하여 후위 연산해보기!!

달려가보자 2012. 4. 15. 04:12

#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 함수에서 스택을 꺼내는 구조입니다.