괄호 검사 프로그램 응용

조회수 1314회

c언어로 괄호 검사 프로그램에서 오류가 났을 때 그 오류에 대한 설명을 좀 더 자세히 출력하도록 하는 부분을 코딩을 잘 못 하겠습니다 포인터를 써야 되는 것 같은데 포인터가 너무 어려워서 시작을 못하겠습니다.

교재의 프로그램은 에러코드를 반환 받아 최종 결과를 main에서 '에러 type만을' 출력해 준다. 이를 개선해서 가능한 상세한 에러메시지를 출력하게 하라. 예를 들면

"8번째 문자에서 에러: ')' 를 만났는데 stack의 open_ch는 '[' 임"

"수식은 끝났는데, 스택에 남아있는 요소들은 ... 임" (print_stack() 호출해서)

*힌트: 이를 위해서는 main()은 수정하지 않고, check_matching()함수안에서 "return 1" 과 같이 에러 리턴하는 곳에서 상세 에러내용을 출력하면 됨

코드를 읽기 위해 필요한 항목

조건 1 :왼쪽 괄호의 개수와 오른쪽 괄호의 개수가 같아야 한다.

조건 2:같은 타입의 괄호에서 왼쪽 괄호는 오른쪽 괄호보다 먼저 나와야 한다. 조건 3:서로 다른 타입의 괄호 쌍이 서로를 교차하면 안 된다.

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

typedef int Element;


Element data[MAX_STACK_SIZE];
int top;


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


void init_stack() { top = -1; }
int is_empty() { return top == -1; }
int is_full() { return top == MAX_STACK_SIZE - 1; }
int size() { return top + 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];
}

void print_stack(char msg[]) {
    int i;
    printf("%s[%2d개]=", msg, size());
    for (i = 0; i < size();i++)
        printf("%2d ", data[i]);
    printf("\n");
}


int check_matching(char expr[])
{
    int i = 0, prev;
    char ch;
    init_stack();
    while (expr[i] != '\0') {
        ch = expr[i++];
        if (ch == '[' || ch == '(' || ch == '{')
            push(ch);
        else if (ch == ']' || ch == ')' || ch == '}') {
            if (is_empty())
                return 2;
            prev = pop();
            if((ch == ']'&& prev !='[')
                    || (ch == ')' && prev != '(')
                    || (ch == '}' && prev != '{')){
                return 3;
            }
        }
    }
    if (is_empty() == 0) return 1;
    return 0;
}


void main()
{
    char expr[4][80] = { "{A[(i+1)]=0;}", "if((i==0) && (j==0)", "A[(i+1])=0;", "A[i] =f)(;" };
    int errCode, i;
    for (i = 0; i < 4;i++) {
        errCode = check_matching(expr[i]);
        if (errCode == 0)
            printf("정상: %s\n", expr[i]);
        else
            printf("오류: %s(조건%d 위반)\n", expr[i], errCode);

    }
}

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)