'후위표기법'에 해당되는 글 1건

  1. 2016.08.05 후위표기법 계산.. 이해 하기 코드..
728x90

 

 

 

#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);

}

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침