728x90
728x170
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | // 중위 표기 수식을 후위 표기 수식으로 변환하는 프로그램 #include <stdio.h> #include <string.h> #define MAX_STACK_SIZE 100 typedef char element; typedef struct { element stack[MAX_STACK_SIZE]; int top; } StackType; // 스택 초기화 함수 void init(StackType *s) { s->top = -1; } // 공백 상태 검출 함수 int is_empty(StackType *s) { return (s->top == -1); } int is_full(StackType *s) { return (s->top == (MAX_STACK_SIZE - 1)); } // 삽입 함수 void push(StackType *s, element item) { if (is_full(s)) { fprintf(stderr, "스택 포화 에러\n"); return; } else s->stack[++(s->top)] = item; } // 삭제 함수 element pop(StackType *s) { if (is_empty(s)) { fprintf(stderr, "스택 공백 에러\n"); exit(1); } else return s->stack[(s->top)--]; } // 피크 함수 element peek(StackType *s) { if (is_empty(s)) { fprintf(stderr, "스택 공백 에러\n"); exit(1); } else return s->stack[s->top]; } // 연산자 우선순위를 반환한다. int prec(char op) { switch (op) { case '(': case ')': return 0; case '+': case '-': return 1; case '*': case '/': return 2; } return -1; } // 중위 표기 수식 -> 후위 표기 수식 void infix_to_postfix(char exp[]) { int i = 0; char ch, top_op; int len = strlen(exp); StackType s; init(&s); // 스택 초기화 for (i = 0; i < len; i++) { ch = exp[i]; switch (ch) { case '+': case '-': case '*': case '/': // 연산자 // 스택에 있는 연산자의 우선순위가 더 크거나 같으면 출력 while (!is_empty(&s) && (prec(ch) <= prec(peek(&s)))) { printf("%c", pop(&s)); } push(&s, ch); break; case '(': // 왼쪽 괄호 push(&s, ch); break; case ')': // 오른쪽 괄호 top_op = pop(&s); // 왼쪽 괄호를 만날 때까지 출력 while (top_op != '(') { printf("%c", top_op); // 피연산자 top_op = pop(&s); } break; default: printf("%c", ch); break; } } while (!is_empty(&s)) { printf("%c", pop(&s)); // 스택에 저장된 연산자들 출력 } } void main() { infix_to_postfix("(2+3)*4+9"); } | cs |
728x90
그리드형(광고전용)
'Source Code > C' 카테고리의 다른 글
이진 탐색 트리 프로그램 (Binary Search Tree Program) (0) | 2020.05.15 |
---|---|
배열 내에서 같은 수의 개수 찾기 (Finding the number of the same number in an array) (0) | 2017.09.14 |
원형 큐 (Circular Queue) 예 (0) | 2017.05.31 |
중위 표기 수식을 전위 표기 수식으로 변환하는 프로그램 (0) | 2017.05.31 |
후위 표기식 계산 프로그램 (5) | 2017.05.16 |
괄호 검사 프로그램 (0) | 2017.05.11 |
연결 리스트로 구현된 리스트 ADT 테스트 프로그램 (0) | 2017.05.08 |
이중 연결 리스트의 다항식 프로그램 (0) | 2017.05.08 |