#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"); // 구하게 될 메인 식 }
결과