Coding Challenge

[소스공유/c언어] 후위연산자 계산기

인생마린 2017. 4. 29. 12:17
반응형

자료구조에 나오는 스택을 이용하여 만든 다항식 계산기 입니다.


1.먼저 괄호가 제대로 쳐졌는지 확인합니다.


2.후위 연산자로 바꾸어줍니다.


3.후위연산식을 통해 연산을 합니다


이 세가지를 모두 스택을 통해 함수로 구현해 보았습니다.


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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef char element;        
 
typedef struct  stackNode {
    element data;
    struct stackNode *link;
} stackNode;
 
stackNode* top;                
 
                            
int isEmpty() {
    if (top == NULLreturn 1;
    else return 0;
}
 
void topMakeNull()
{
    stackNode *temp;
    while (top != NULL)
    {
        temp = top;
        top = top->link;
        free(temp);
    }
}
 
void push(element item) {
    stackNode* temp = (stackNode *)malloc(sizeof(stackNode));
    temp->data = item;
    temp->link = top;        
    top = temp;                
}
 
 
element pop() {
    element item;
    stackNode* temp = top;
 
    if (top == NULL) {        
        printf("\n\n Stack is empty !\n");
        return 0;
    }
    else {                    
        item = temp->data;
        top = temp->link;    
        free(temp);            
        return item;        
    }
}
 
 
int testPair(char *exp) {
    
    topMakeNull();
    char symbol, open_pair;
 
    int i, length = strlen(exp);
    top = NULL;
 
    for (i = 0; i<length; i++) {
        symbol = exp[i];
        switch (symbol) {
        
        case '(':
        case '[':
        case '{':
            push(symbol); break;
            
        case ')':
        case ']':
        case '}':
            if (top == NULLreturn 0;
            else {
                
                open_pair = pop();
                
                if ((open_pair == '(' && symbol != ')'||
                    (open_pair == '[' && symbol != ']'||
                    (open_pair == '{' && symbol != '}'))
                    
                    return 0;
                
                else break;
            }
        }
    }
    if (top == NULLreturn 1;
    else return 0;            
}
 
char* changeFormBack(char *exp)
{
    topMakeNull();
    char symbol;
    int length = strlen(exp), count = 0;
    char *changeValue = (char *)malloc(sizeof(char)*length);
    memset(changeValue,'\0',length);
    for (int i = 0;i < length; i++)
    {
        symbol = exp[i];
        if ('0'<=  symbol&&symbol <= '9')
        {
            changeValue[count++= symbol;
            continue;
        }
        switch (symbol) {
        case '+':
        case '-':
        case '*':
        case '/':
            push(symbol); break;
        case ')':
        case '}':
        case ']':
            changeValue[count++]=pop();
            break;
 
        }
 
    }
    return changeValue;
}
 
 
element evalPostfix(char *exp) {
    topMakeNull();
    int opr1, opr2, value, i = 0;
 
    int length = strlen(exp);
    char symbol;
    top = NULL;
 
    for (i = 0; i<length; i++) {
        symbol = exp[i];
        if (symbol>='0'&&symbol<='9') {
            value = symbol - '0';
            push(value);
        }
        else {
            opr2 = pop();
            opr1 = pop();
    
            switch (symbol) {
            case '+': push(opr1 + opr2); break;
            case '-': push(opr1 - opr2); break;
            case '*': push(opr1 * opr2); break;
            case '/': push(opr1 / opr2); break;
            }
        }
    }
 
    return pop();
}
 
 
 
 
 
int main(void) {
    char* exp;
    char express[100];
    int result;
    
    printf("수식을 입력해주세요. ex) { (3 * 5) - (6 / 2) }\n");
    gets_s(express,100);
 
 
    if (testPair(express) == 1)
        printf("\n\n수식의 괄호가 맞게 사용되었습니다!");
    else
        printf("\n\n수식의 괄호가 틀렸습니다!");
 
 
    exp=changeFormBack(express);
    printf("\n\n후위 연산자로 바꾼값-> %s", exp);
 
    result = evalPostfix(exp);
    printf("\n\n연산 결과 => %d", result);
 
    return 0;
}


결과 보기



※과제로 복붙해서 내시는 분들 있기 때문에 복붙 방지가 되어있습니다. 스스로 쳐보고 소스를 이해해주시길 바랍니다. 본 블로그는 실력을 향상하기 위해서 있는거지 과제를 복붙하기 위해 있는게 아님을 알려드립니다.

반응형