별의 공부 블로그 🧑🏻‍💻
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// 중위 표기 수식을 전위 표기 수식으로 변환하는 프로그램
 
#include <stdio.h>
#include <string.h>
 
#define MAX_STACK_SIZE 100
 
typedef int 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 reverse_exp(char *exp) {
    int i = 0, j = 0;
    int len = strlen(exp);
    char *= (char *)malloc(sizeof(char)*(len + 1));
    StackType t;
 
    init(&t);   // 스택 초기화
                // 배열 exp에 들어있는 요소를 배열 a에 옮김.
    for (i = 0; i < len; i++) {
        a[i] = exp[i];
    }
    // 스택 t에 배열 a의 요소들을 push.
    for (i = 0; i < len; i++) {
        push(&t, a[i]);
    }
    // 배열 exp에 스택 t에 있는 요소들을 pop하여 나온 원소들을 삽입.
    for (i = 0; i < len; i++) {
        exp[i] = pop(&t);
    }
}
 
// 중위 표기 수식 -> 전위 표기 수식
char* infix_to_prefix(char exp[]) {
    int i = 0, j = 0;
    char ch, top_op;
    int len = strlen(exp);
    char *ex = (char *)malloc(sizeof(char)*(len + 1));
    StackType s;
    init(&s);            // 스택 초기화
    for (i = len - 1; i >= 0; i--) {
        ch = exp[i];
        switch (ch) {
        case '+'case '-'case '*'case '/'// 연산자
                                                // 스택에 있는 연산자의 우선순위가 더 크거나 같으면 출력                         
            while (!is_empty(&s) && (prec(ch) < prec(peek(&s)))) {
                ex[j++= pop(&s);
            }
            push(&s, ch);
            break;
        case ')':        // 오른쪽 괄호
            push(&s, ch);
            break;
        case '(':        // 왼쪽 괄호
            top_op = pop(&s);
            // 오른쪽 괄호를 만날 때까지 출력
            while (top_op != ')') {
                ex[j++= top_op;
                top_op = pop(&s);
            }
            break;
        default:
            ex[j++= ch;
            break;
        }
    }
    while (!is_empty(&s)) {
        ex[j++= pop(&s);
    }
    ex[j] = NULL;            // 문자열 끝은 널문자
 
    reverse_exp(ex);
    return ex;
}
 
void main() {
    printf("%s \n", infix_to_prefix("(2+3)*4+9"));
}
 
cs
728x90
그리드형(광고전용)
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️
starrykss
starrykss
별의 공부 블로그 🧑🏻‍💻


📖 Contents 📖