본문 바로가기
잡담

중위 수식의 후위 표기 변환 [C 언어]

by PrintedLove 2020. 11. 2.
#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 100

typedef int Element;
Element data[MAX_STACK_SIZE];
int top;

void init_stack() { top = -1; }
int size() { return top + 1; }
int is_empty() { return (top == -1); }
int is_full() { return (top == MAX_STACK_SIZE -1); }

void error(char str[]) {
	printf("%s\n", str);
	exit(1);
}

void push (Element e) {
	if (is_full())
		error("스택 포화 에러");
		
	data[++top] = e; 
}

Element pop() {
	if(is_empty())
		error("스택 공백 에러");
		
	return data[top--];
}

Element peek() {
	if(is_empty())
		error("스택 공백 에러");
		
	return data[top];
}

static int precedence(char op) {
	switch(op) {
		case '(': case ')': return 0;
		case '+': case '-': return 1;
		case '*': case '/': return 2;
	}
	
	return -1;
}

void infix_to_postfix(char expr[]) {
	int i = 0;
	char term, e;
	
	init_stack();		//스택 초기화 
	
	while(expr[i] != '\0') {		//받은 수식에 처리할 항이 남아있으면 
		term = expr[i++];			//temp = 다음에 처리할 항 
			
		switch(term) {
			case '(': push(term); break;			//왼쪽 괄호 일시 
			
			case ')':
				while (!is_empty()) {				//오른쪽 괄호 일시 
					e = pop();
					
					if (e == '(') break;
					else printf("%c", e);
				}
				break;
				
			case '+': case '-': case '*': case '/':		//연산자 일시 
				while (!is_empty()) {
					e = peek();
					
					if (precedence(term) <= precedence(e)) {
						printf("%c", e);
						pop();
					} else break;
				}
				
				push(term);
				break;
				
			default:
				printf("%c", term); break;		//피연산자 일시 
		}
	}
	
	while (!is_empty())			//남은 스택 출력 
		printf("%c", pop());
	
	printf("\n");
}

int main() {
	char expr[2][80] = {"8/2-3+(3*2)", "1/2*4*(1/4)"};

	printf("중위수식: %s ==> 후위수식:", expr[0]);
	infix_to_postfix(expr[0]);
	printf("중위수식: %s ==> 후위수식:", expr[1]);
	infix_to_postfix(expr[1]);
	
	return 0;
}

댓글