본문 바로가기

소프트웨어/C/C++

후위표기법 C언어

/****************************************************************/

/************혹여나 과제제출하려고 긁어가는거면 ...비추입니다...*****/

/******배열까지밖에 안배우고 군대갔다왔는데 갑자기 스텍이라니!!!!!!!!*****/

/*********최적화되지 않은 프로그램입니다 ㅋㅋ**************************/

/***********************암튼 퍼가시는거 비추 ㅋㅋㅋ******************/

/**************주기싫어서그러는게아니라 퍼가신분혼날까봐 ㅋㅋ******/ 

 

 

 

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define STACK_LEN 15

typedef char Data;

typedef struct{

Data stackArr[STACK_LEN];

int top;

}ArrayStack;

typedef ArrayStack Stack;

void init(Stack *pstack){

pstack->top=-1;

}//top 초기화

int isEmpty(Stack *pstack){

if( pstack->top ==-1)

return 1;

else return 0;

}//빈스텍인지 검사

void push(Stack *pstack,Data data){

pstack->top +=1;

pstack->stackArr[pstack->top]=data;

}//push. top증가후 데이터삽입

Data pop(Stack *pstack){

char temp,temp2;

if (isEmpty(pstack)==1){

printf(" Empty stack");

}

temp=pstack->top; //top의 int값을 temp로 저장

pstack->top -=1;

temp2=pstack->stackArr[temp]; //int값으로 직전의 top이가리키던값 리턴

pstack->stackArr[temp]=0;

return temp2; //int값으로 직전의 top이가리키던값 리턴

}//pop.

Data peek(Stack *pstack){

if (pstack->top==-1){

printf("Stack is emtpy3\n");

}

else return pstack->stackArr[pstack->top];

}

void deleteElement(Stack *pstack){

if (pstack->top==-1) {

printf("Stack is emtpy");

}

else{

pstack->stackArr[pstack->top]=0;

pstack->top -=1;

}

}

/*********************여기까지 스텍관련함수들*********************/

int checkPIS(char peeking){

int pis=0;

if (peeking=='*' || peeking=='/') {

pis=3;}

else if ( peeking=='+' || peeking=='-' ){

pis=2;}

else if( peeking=='('){

pis=1; }

return pis;

}

int checkPIE(char tk){

int pie;

if (tk=='*' || tk=='/') {

pie=3; }

else if (tk=='+' || tk=='-') {

pie=2; }

else if (tk=='(' ){

pie=4;}

return pie;

}/***********************여기까지 PIS,PIE cheking **********/

int main(void){

char tmp[20];

char exptemp[15]={NULL};//후위표기후 출력값이 저장되는 배열

int i=0,j=0,t=0,cnt=1,expcount=0,popcount=0;

// j출력카운트 cnt는 전체while문돌리기위한 cnt. t는 푸쉬하면 ++

char tk,peeking;

Stack stack;

stack.stackArr[STACK_LEN]=NULL;

init(&stack);

printf("수식을 입력하시오 : ");

scanf("%s",tmp);

while(cnt !=0){

tk=tmp[i]; //gettoken의 역할을 한다

printf("수식: %s 토큰값: %c\n스택값: ",tmp,tk);puts(stack.stackArr);

printf("카운트 : %d\n",i);

if (tk==')'){

while( peek(&stack) != '('){

exptemp[expcount]=pop(&stack);

popcount++; expcount++;

}

if (peek(&stack)=='('){ //'('와')'사이에 아무값도없는경우 스텍속의 '('를 삭제합니다

deleteElement(&stack);

if ( peek(&stack)!='('){ //만약 삭제된'('앞에 또 '('가 없을시에는 삭제된 (의 앞의 오퍼렌드를 팝합니다. 그이유는 이 조건문을 안걸어주면 다중으로 괄호가 걸려있을시 두개의 괄호 모두를 팝해버리기 때문입니다.

exptemp[expcount]=pop(&stack);

popcount++; expcount++;

}

}//괄호비교후 '('를 지웁니다

//그후 괄호직전의 오퍼레이션을 팝합니다

i++;

printf("출력값:");

for(j=0;j<=expcount;j++){

printf("%c",exptemp[j]);}

printf("\n\n\n");

}

else if (tk=='*' || tk=='/' || tk=='+' || tk=='-' || tk=='('){

while( checkPIS(peek(&stack)) >= checkPIE(tk)){

if(checkPIS(peek(&stack)) == checkPIE(tk)){

exptemp[expcount]=pop(&stack);

popcount++; expcount++;

}//같으면 pop, 스택이크면 tk가 exp로

else if (checkPIS(peek(&stack)) > checkPIE(tk)){

exptemp[expcount]=tk;

expcount++;

}

push(&stack,tk);//stack의 PIS가 작은 경우 토큰 PUSH

popcount--;

t++;

if (peek(&stack)==tk){

break;

}

}

push(&stack,tk);

popcount--;

t++; i++;

printf("출력값:");

for(j=0;j<=expcount;j++){

printf("%c",exptemp[j]);

}printf("\n\n\n");

}

else if (tk==NULL) {

while(t!=0){

exptemp[expcount]=pop(&stack);

popcount++; expcount++;

t--; cnt=t;

}

printf("출력값:");

for(j=0;j<=expcount;j++){

printf("%c",exptemp[j]);

}printf("\n\n\n");

i++;

}

else{

exptemp[expcount]=tk;

expcount++;

printf("출력값:");

for(j=0;j<=expcount;j++){

printf("%c",exptemp[j]);

}printf("\n\n\n");

i++;

}

/**************여기까지 postfix계산과정********************/

printf("후위표기변환된 식은 %s입니다.\n",exptemp);

system("pause");

return 0;

}

'소프트웨어 > C/C++' 카테고리의 다른 글

객체] public, protected, private  (0) 2013.08.11
c/c++] 클래스 동적할당  (0) 2013.08.10
c++] 동적할당실패시 예외처리  (0) 2013.08.10
c/c++] malloc은 void*를 리턴  (0) 2013.08.10
C/C++] 구조체의 크기  (0) 2013.08.10
데이터 검색  (0) 2012.04.01
순위구하기 알고리즘  (0) 2012.04.01