Stack -(Quize3)

μ±„μž¬ν—ŒΒ·2022λ…„ 7μ›” 15일
0

🎈1. 문제

πŸŽ†2. μ†ŒμŠ€μ½”λ“œ + 주석

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STACK_SIZE 100

int err = 0;

typedef char element;

typedef struct {
        element data[MAX_STACK_SIZE];
        int top;
} StackType;

//μ΄ˆκΈ°ν™” ν•¨μˆ˜
void init_stack(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->data[++(s->top)] = item;
}
//μ‚­μ œ ν•¨μˆ˜

element pop(StackType *s)
{ if (is_empty(s)) {
        fprintf(stderr, "μŠ€νƒ 곡백 μ—λŸ¬\n");
        exit(1);
        }
else return s->data[(s->top)--];

}
 //피크 ν•¨μˆ˜
element peek(StackType *s)
{
        if (is_empty(s)) {
                fprintf(stderr, "μŠ€νƒ 곡백 μ—λŸ¬\n");
                exit(1);
        }
        else return s->data[s->top];
}

//ν›„μœ„ ν‘œκΈ° μˆ˜μ‹ 계산 ν•¨μˆ˜
int eval(char exp[])
{
        int op1, op2, value, i = 0;
        int len = strlen(exp);
        char ch;
        StackType s;


        init_stack(&s); //μŠ€νƒμ΄ˆκΈ°ν™” ( 생성)
        for (i = 0; i < len; i++) {
        ch = exp[i];
        if (ch != '+' && ch != '-' && ch != '*' && ch != '/') {
                value = ch - '0';//μž…λ ₯이 ν”Όμ—°μ‚°μžμ΄λ©΄
                push(&s, value);
        }
        else { //μ—°μ‚°μžμ΄λ©΄ ν”Όμ—°μ‚°μžλ₯Ό μŠ€νƒμ—μ„œ 제거
        op2 = pop(&s);
        op1 = pop(&s);
        switch (ch) { //연산을 μˆ˜ν–‰ν•˜κ³  μŠ€νƒμ— μ €μž₯
        case '+': push(&s, op1 + op2); break;
        case '-': push(&s, op1 - op2); break;
        case '*': push(&s, op1 * op2); break;
        case '/': push(&s, op1 / op2); break;
                }
        }
}
        return pop(&s);
}
 //μ—°μ‚°μžμ˜ μš°μ„  μˆœμœ„λ₯Ό λ°˜ν™˜ν•œλ‹€.
int prec(char op)
{ switch (op) {
case '(': case ')': return 0;
case '+': case '-': return 1;
case '*': case '/': return 2;
        }
return -1;
}

void check_error(element exp[]) {
        err = -1;
        int len = strlen(exp);

        //였λ₯˜ 0 : μ—°μ‚°μžν›„ 0이 였면 μ˜ˆμ™Έμ²˜λ¦¬
        for (int i = 0; i < len; i++) {
                if (i + 1 < len && exp[i] == '/' && exp[i + 1] == '0') {
                        printf("계산결과 : ");
        printf("였λ₯˜ : 0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.\n\n");
        err = 0;
        break;
        }
}

        int count = 0;
//였λ₯˜ 1 : κ΄„ν˜Έμ˜ 짝이 λ§žμ§€ μ•ŠμœΌλ©΄ μ˜ˆμ™Έμ²˜λ¦¬
for (int i = 0; i < len; i++) {
        if (exp[i] == '(') {
        count++;
        }
        else if (exp[i] == ')') {
                count--;
                }
        }
        if (count > 0) {
        printf("계산 κ²°κ³Ό\n");
        printf("였λ₯˜1: κ΄„ν˜Έ λ§€μΉ­ λΆˆκ°€λŠ₯\n\n");
        err = 1;
        }
        else if (count < 0) {
        printf("계산 κ²°κ³Ό\n");
        printf("였λ₯˜1: κ΄„ν˜Έ λ§€μΉ­ λΆˆκ°€λŠ₯2\n\n");
        err = 1;
        }

//였λ₯˜ 2 : μ˜ˆμ™Έ 문자 포함
        for (int i = 0; i < len; i++) {
        if (exp[i] == '(' || exp[i] == ')') {
                continue;
        }
        else if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') {
                continue;
        }
        else if ('0' <= exp[i] && exp[i] <= '9') {
                continue;
        }
        else {
                printf("계산결과\n");
                printf("였λ₯˜2: μ˜ˆμ™Έ 문자 포함\n\n");
                err = 2;
        }
}

//ν•œμžλ¦¬ 수 μ΄μƒμ˜ 수 μž…λ ₯에 λŒ€ν•΄ μ˜ˆμ™Έμ²˜λ¦¬

int count_len = 0;
int max_len = 0;
for (int i = 0; i < len; i++){
        if ('0' <= exp[i] && exp[i] <= '9') {
                count_len++;
                if (count_len >= max_len) {
                        max_len = count_len;
                }
        }
        else { count_len = 0;
        }
        }
if (max_len >= 2) {
        printf("계산결과\n");
        printf("였λ₯˜ 3: ν•œ 자리수 μ΄μƒμ˜ μž…λ ₯ 포함\n\n");
        err = 3;
        }
}
//μˆ˜μ‹ λ³€ν™˜ ν•¨μˆ˜

element* infix_to_postfix(element exp[]) {

                //μž…λ ₯받은 ν‘œκΈ°μ‹ 였λ₯˜ 검사
        check_error(exp);
        //였λ₯˜κ°€ μžˆλ‹€λ©΄ λ‹€μ‹œ μ‹€ν–‰
        if (err != -1) {
                return NULL;
        }
        int i, idx = 0; //iλŠ” forλ¬Έ μ œμ–΄ λ³€μˆ˜ ,idx λŠ” post_arr의 inded
        int len = strlen(exp);
        char ch, op;
        StackType s;
        element* postfix_arr = (element*)malloc(MAX_STACK_SIZE);
        if (postfix_arr == NULL) {
                fprintf(stderr, "λ©”λͺ¨λ¦¬ ν• λ‹Ή μ—λŸ¬\n");
                exit(1);
        }

        init_stack(&s); //μŠ€νƒ 촉기화

        // μ€‘μœ„ ν‘œκΈ°μ‹μœΌλ‘œ ν‘œν˜„λœ 식을 순회
        for (int i = 0; i < len; i++) {

                        // 값을 λ½‘λŠ”λ‹€
                ch = exp[i];
                //일반 숫자라면 κ·Έλž˜λ„ postfix_arr에 μΆ”κ°€
                if ('0' <= ch && ch <= '9') {
                        postfix_arr[idx++] = ch;
                }

//μ—°μ‚°μž +,-,/라면
                else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {

                        while (!is_empty(&s) && (prec(ch) <= prec(peek(&s))))
                        {
                                        //ν•΄λ‹Ή 값듀은 λͺ¨λ‘ μΆ”κ°€ν•΄ μ€€λ‹€.
                                postfix_arr[idx++] = peek(&s);
                                pop(&s);
                        }
                        //자기 μžμ‹ μ„ μŠ€νƒμ— μΆ”κ°€ν•œλ‹€.
                        push(&s, ch);
                }
//'('λŠ” 무쑰건 μŠ€νƒμ— μΆ”κ°€ν•œλ‹€.
                else if (ch == '(') {
                        push(&s, ch);
                }
//')'κ°€ λ‚˜μ˜€λ©΄ '('κ°€ λ‚˜μ˜¬λ•ŒκΉŒμ§€ μŠ€νƒμ—μ„œ popν•˜μ—¬ μΆ”κ°€ν•΄μ€€λ‹€.
                else if (ch == ')') {
                        op = pop(&s);
                        while (op != '(')
                        {
                                postfix_arr[idx++] = op;
                                op = pop(&s);
                        }
                }
        }

        //아직 μŠ€νƒμ— λ‚¨μ•„μžˆλŠ” 값듀을 λͺ¨λ‘ μΆ”κ°€ν•΄μ€€λ‹€.
        while (!is_empty(&s))
        {
                op = peek(&s);
                pop(&s);
                postfix_arr[idx++] = op;
        }
// λ¬Έμžμ—΄μ˜ 끝을 μ§€μ •ν•΄μ€€λ‹€.
        postfix_arr[idx] = '\0';
        return postfix_arr;
}


int main(void) {
        element expression[MAX_STACK_SIZE];
        char word[100];
        //μ€‘μœ„ ν‘œμ‹œμ‹ μž…λ ₯
                printf("μ‹€ν–‰ κ²°κ³Ό\n");
                printf("μˆ˜μ‹μ„ μž…λ ₯ν•˜μ„Έμš” : ");
                scanf("%s", expression);
                //μ€‘μœ„ ν‘œκΈ°μ‹ 및 κ²°κ³Ό κ°’ ν‘œμ‹œ
                element *result = infix_to_postfix(expression);
                if (err == -1) {
                        printf("ν›„μœ„μ‹ : %s\n", result);
                        printf("계산결과 : %d\n\n", eval(result));
                }


        return 0;
}

πŸŽ‡3. μ‹€ν–‰ κ²°κ³Ό

✨4. λŠλ‚Œμ &μ„€λͺ…

이번 ν€΄μ¦ˆμ—μ„œλŠ” μŠ€νƒμ„ μ΄μš©ν•œ μ€‘μœ„ν‘œκΈ°λ²•μ„ ν›„μœ„ ν‘œκΈ°λ²•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” κ³„μ‚°λ²•μ΄λž‘ κ·Έ κ²°κ³Ό 값을 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“œλŠ” ν™œλ™μ„ ν•˜μ˜€λ‹€. λ¨Όμ € 이번 ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” 기본적인 μŠ€νƒμ˜ 동적할당과 μŠ€νƒ ν•¨μˆ˜μ— λŒ€ν•œ μ™„λ²½ν•œ μˆ™μ§€κ°€ ν•„μš”ν–ˆμœΌλ©°, 이 문제의 νŠΉμ§•μœΌλ‘œ, μ€‘μœ„ ν‘œκΈ°λ²•μ„ ν›„μœ„ ν‘œκΈ°λ²•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 벙법과 ν›„μœ„ ν‘œκΈ°λ²• 계산방법과 이λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ 절차λ₯Ό μƒκ°ν•˜λŠ” 것이 κ°€μž₯ μ€‘μš”ν–ˆλ‹€. λ¨Όμ € μ€‘μœ„ ν‘œκΈ°λ²•μ„ ν›„μœ„ ν‘œκΈ°λ²•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” μ ˆμ°¨λŠ” κ°„λ‹¨ν•˜κ²Œ ν”Όμ—°μ‚¬μžκ°€ λ“€μ–΄μ˜€λ©΄ λ°”λ‘œ 좜λ ₯ν•˜κ³  μ—°μ‚°μžκ°€ λ“€μ–΄μ˜€λ©΄ μžκΈ°λ³΄λ‹€ μš°μ„ μˆœμœ„κ°€ λ†’κ±°λ‚˜ 같은것듀을 λΉΌκ³  μžμ‹ μ„ μŠ€νƒμ— 담은 λ’€ β€˜(’λ₯Ό λ§Œλ‚˜λ©΄ 무쑰건 μŠ€νƒμ— λ‹΄κ³ , λ‹«λŠ” κ΄„ν˜Έ β€˜)λ₯Ό λ§Œλ‚˜λ©΄ β€œ(”λ₯Ό λ§Œλ‚  λ•Œ κΉŒμ§€ μŠ€νƒμ—μ„œ 좜λ ₯ν•˜λŠ” κ²ƒμœΌλ‘œ μ΄λŸ¬ν•œ 절차λ₯Ό 톡해 μŠ€νƒμ— μžˆλŠ” μ—°μ‚°μž μš°μ„ μˆœμœ„λ₯Ό μ΄μš©ν•˜λ©΄ μ€‘μœ„ ν‘œκΈ°λ²•μ„ ν›„μœ„ ν‘œκΈ°λ²•μœΌλ‘œ λ³€ν™˜ ν•  수 μžˆκ² λ‹€κ³  μƒκ°ν•˜μ˜€λ‹€. 그리고 ν›„μœ„ ν‘œκΈ°λ²• 계산은 ν”Όμ—°μ‚°μžλ₯Ό λ§Œλ‚˜λ©΄ μŠ€νƒμ— λ‹΄κ³  μ—°μ‚°μžλ₯Ό λ§Œλ‚˜λ©΄ μŠ€νƒμ—μ„œ 두 개의 μ—°μ‚°μžλ₯Ό κΊΌλ‚΄μ„œ μ—°μ‚°ν•œ λ’€ κ·Έ κ²°κ³Όλ₯Ό μŠ€νƒμ— λ‹΄μ•„ 연산을 마치고 μŠ€νƒμ— λ‚¨μ•„μžˆλŠ” ν•˜λ‚˜μ˜ ν”Όμ—°μ‚°μžκ°€ μ—°μ‚° μˆ˜ν–‰μ˜ κ²°κ³Όκ°€ 되면 ν›„μœ„ ν‘œκΈ°λ²• 계산을 μ™„λ£Œν•˜λŠ” 절차λ₯Ό 톡해 μ½”λ“œλ₯Ό ꡬ성 ν•  수있게 λ˜μ—ˆλ‹€. μ΄λ ‡κ²Œ ν›„μœ„ ν‘œκΈ°λ²• κ³„μ‚°μ΄λž‘ μ€‘μœ„ ν‘œκΈ°λ²•μ„ ν›„μœ„ ν‘œκΈ°λ²•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” μ½”λ“œλ₯Ό ν€΄μ¦ˆλ₯Ό ν’€λ•ŒλŠ” μ‹œκ°„λ‚΄ 슀슀둜 ν’€μ§€λŠ” λͺ» ν•˜μ˜€μ§€λ§Œ, ν€΄μ¦ˆκ°€ λλ‚œ ν›„ ν›„μœ„ ν‘œκΈ°λ²•κ³Ό λ³€ν™˜ν•˜λŠ” 절차λ₯Ό 천천히 μ‚΄νŽ΄λ³΄κ³  μ΄ν•΄ν•˜λ©΄μ„œ λ§Žμ€ μ‹œκ°„μ„ νˆ¬μžν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ ν•  수 μžˆμ—ˆλ‹€. 이번 ν€΄μ¦ˆλ₯Ό 톡해 슀슀둜 μŠ€νƒμ„ μ™„λ²½ν•˜κ²Œ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μŠ€νƒμ„ μ΄μš©ν•œ λ‹€μ–‘ν•œ 예제 문제λ₯Ό μ½”λ”©μ‚¬μ΄νŠΈμ—μ„œμ„œ 찾아보고 μŠ€νƒμ— λŒ€ν•œ 이해λ₯Ό 더 λ†’μ—¬ μŠ€νƒμ„ 슀슀둜 μ™„λ²½ν•˜κ²Œ κ΅¬ν˜„ν•΄μ•Όκ² λ‹€κ³  μƒκ°ν•˜λŠ” 계기가 λ˜μ—ˆκ³ ,μ•žμœΌλ‘œ ν€΄μ¦ˆλ₯Ό ν’€κ³  ν€΄μ¦ˆμ™€ μ—°κ΄€λœ 문제λ₯Ό 많이 ν’€μ–΄λ΄μ•Όκ² λ‹€λŠ” 생각도 λ“€μ—ˆλ‹€.

0개의 λŒ“κΈ€