#include<stdio.h>
#include<stdlib.h> #include<string.h> // 아래 프로그램을 위한 기본 헤더 파일들
#define MAX_STACK_SIZE 100 // 스택의 최대 사이즈를 상수값 100으로 선언한다.
typedef char element; // element를 char 타입으로 사용하게끔 정의한다.
typedef struct { // 구조체 타입을 정의
element stack[MAX_STACK_SIZE]; // (element) char stack[100];
int top;
} StackType; // 이 구조체는 StackType이란 이름을 사용한다.
int is_full(StackType *s){ // 스택이 full인지 검사하는 함수 구조체 StackType 포인터 s선언
return (s->top==(MAX_STACK_SIZE-1)); // 스택->top의 값이 ==(100-1)이면 return 1;
} // s->top==(99) 아니면 return 0;
void init(StackType *s){ // 스택 초기화 함수
s->top = -1; // 스택->top에 -1을 대입
}
int is_empty(StackType *s){ // 스택이 비어있는지 체크
return (s->top==-1); // 스택->top == -1 (초기화 시킨 값과 같으면) return 1;
} // 비어있지 않으면 return 0;
void push(StackType *s, element item){ // 스택에 밀어넣기 (스택구조포인터, 값)
if (is_full(s)){ // 스택이 full ?
printf("공백에러"); // "공백에러" 출력
return;
} else s->stack[++(s->top)] = item; // ! full > 스택-> (element stack[MAX_STACK_SIZE];)
} // stack[++(스택->top)] = 받아 온 item값;
// ++는 선위연산자이므로 s->top값을 우선 증가 시킨 후 item의 값을 대입 시킨다.
// stack[-1] 에서 stack[0]=item값;
element pop(StackType *s){ // 스택에서 꺼내기 / char pop(StackType *s);
if (is_empty(s)){ // 빈 스택 체크
printf("공백에러");
exit(1);
} else return s->stack[(s->top)--]; // 스택의 값을 리턴 후 배열을 감소시킨다.(후위)
}
element peek(StackType *s){ // 스택에서 값확인 / char peek(StackType *s);
if(is_empty(s)){ // 빈 스택 체크
printf("공백에러");
exit(1);
}
else return s->stack[s->top]; // 스택의 값을 리턴만 시킨다.
}
int prec(char op){ //연산자의 우선순위를 정하는 함수
switch(op){
case'(':case')':return 0; // 우선순위 0 < 1 < 2;
case'+':case'-':return 1;
case'*':case'/':return 2;
}
return -1; // 없으면 -1 반환.
}
void infix_to_postfix(char exp[]){
int i=0;
char ch, top_op;
int len=strlen(exp); // len 변수에 exp길이를 체크하여 값을넣는다.
StackType s; //구조체 s를 선언.
init(&s); // 초기화함수 init을 이용 s의 주소를 넘겨주어 초기화한다.
for(i=0;i<len;i++){ // i<문자의 길이
ch=exp[i]; // ch=exp[0] "("를 저장으로 시작
switch(ch){
case'+': case '-' : case '*' : case '/' :
while(!is_empty(&s) && (prec(ch)<=prec(peek(&s))))
// 빈스택이 아니고(0) && 우선순위가 ch<=현재 스택의 값인 동안
printf("%c",pop(&s)); //스택에서 꺼내어 출력한다.
push(&s, ch); //현재 ch의 값을 스택에 밀어넣는다.
break; //빠져나가기.
case '(':
push(&s, ch);
break;
case ')': // ")"의 경우
top_op = pop(&s); //top_op의 변수에 스택의 값을 꺼내어 저장
while(top_op!='('){ //top_op의 변수가 "("가 아닐 동안
printf("%c", top_op); // top_op의 값을 출력
top_op=pop(&s); // top_op의 값을 스택에서 계속꺼내어 저장
}
break;
default:
printf("%c",ch); //경우가 없을 때 기본적으로 ch를 출력시킨다.
break;
}
}
while(!is_empty(&s)) //빈스택이 아닐동안 (스택이 빌때까지)
printf("%c", pop(&s)); // 스택에서 꺼내어 출력
}
main(){
infix_to_postfix("(2+3)*4/2"); // 구하게 될 메인 식
}
결과