#include "Calculator.h"
#include <stdio.h>
#include <stdlib.h>
char* PostfixNotation(char* str)
{
//stridx->후기표기법으로 수정 할 문자열 인덱스,idx->변환 된 문자가 들어갈 인덱스
int stridx=0,idx=0;
char PostStr[SIZE_ARR];
Stack s;
StackInit(&s);
while(str[stridx]>0)
{
char a=str[stridx];
if(a>='0'&&a<='9') //피연산자는 바로 PostStr에 저장
{
PostStr[idx]=a;
stridx++;
idx++;
}
else
{
switch(a) // a가 연산자일경우 : 우선순위 *,/ > +,- > ( [ ')'나오면 '('나올때까지 Pop]
{
case '+':case '-':
{
if(SIsEmpty(&s)) // 스택에 비었을 경우 바로 Push
{
SPush(&s,a);
stridx++;
}
else if(SPeek(&s)=='(') // '('있을경우 그대로 Push
{
SPush(&s,a);
stridx++;
}
else // 같은 연산자이거나, *혹은/연산자가 있을경우 전부 Pop한 후 Push
{
while(!SIsEmpty(&s))
{
PostStr[idx]=SPop(&s);
idx++;
}
SPush(&s,a);
stridx++;
}
break;
}
case '*':case '/': //우선순위가 가장 높기 때문에 그대로 Push
{
SPush(&s,a);
stridx++;
break;
}
case '(': //가장 낮은 우선순위이면서 특이한 케이스 그대로 Push
{
SPush(&s,a);
stridx++;
break;
}
case ')': //'('나올 때 까지 모두 Pop시켜줌
{
while(SPeek(&s)!='(')
{
PostStr[idx]=SPop(&s);
idx++;
}
SPop(&s);
stridx++;
break;
}
}
}
}
while(!SIsEmpty(&s))
{
PostStr[idx]=SPop(&s);
idx++;
}
return PostStr;
}
void SInit(IntStack *ps)
{
ps->TopIndex=-1;
}
int SEmpty(IntStack *ps)
{
if(ps->TopIndex==-1)
return TRUE;
else
return FALSE;
}
int SFull(IntStack *ps)
{
if(ps->TopIndex==SIZE_ARR)
return TRUE;
else
return FALSE;
}
void Push(IntStack *ps,int data)
{
ps->arr[++ps->TopIndex]=data;
}
int Pop(IntStack *ps)
{
return ps->arr[ps->TopIndex--];
}
int Peek(IntStack *ps)
{
return ps->arr[ps->TopIndex];
}
//피연산자는 스택에 바로 Push, 연산자가 나올 때마다 스택 Pop두번해 피연산자 2개 호출 후 연산 뒤 다시 스택에 Push
int CalculatePost(char* str)
{
int idx=0;
int i=0;
IntStack s;
SInit(&s);
while(str[idx]>0)
{
int num=0;
if(str[idx]>='0'&&str[idx]<='9')
{
Push(&s,(str[idx]-'0'));
idx++;
}
else
{
switch(str[idx])
{
case '+':
{
num=Pop(&s)+Pop(&s);
Push(&s,num);
idx++;
break;
}
case '-':
{
num=Pop(&s)-Pop(&s);
Push(&s,num);
idx++;
break;
}
case '*':
{
num=Pop(&s)*Pop(&s);
Push(&s,num);
idx++;
break;
}
case '/':
{
num=Pop(&s)/Pop(&s);
Push(&s,num);
idx++;
break;
}
}
}
}
return Pop(&s);
}
'C++' 카테고리의 다른 글
빅오표기법 정리. (0) | 2015.01.07 |
---|---|
C++ 스타일의 캐스트 (0) | 2014.12.31 |
라이브러리(dll(동적), lib(정적)) 생성 및 사용법 (3) (0) | 2014.08.22 |
라이브러리(dll(동적), lib(정적)) 생성 및 사용법 (2) (1) | 2014.08.22 |
라이브러리(dll(동적), lib(정적)) 생성 및 사용법 (1) (0) | 2014.08.22 |