자 첫번째 게시물입니다!

차민재·2022년 1월 27일
post-thumbnail

첫번째 게시물로 공부했던 스택 응용프로그램을 올리기로 했다. 뭔가 두근두근한 기분.

다음에는 프로그래머스 문제나 백준을 올리는 게 목표다 ㅎ..

이 프로그램은 괄호가 올바르게 사용되었는지 검사하는 프로그램이다. 예를 들어
{ ( A[i] ) } 이런 식의 문자열이 있다면 이건 올바르게 작성된 것이고,
{ ( A[i) ] } 이런 문자열은 실패한 문자열을 검사하는 프로그램이다.

스택이 맨 나중에 것만 뺄 수 있다는 장점이 있고 차례대로 저장할 수 있으니 괄호를 왼쪽 괄호들 ( , [ , { 를 스택에 저장하고 오른쪽 괄호 ), ], } 를 체크할 때 왼쪽 괄호와 쌍이 맞는 지 검사하는 방법이다. 마지막으로 스택에서 차례대로 다 뺐는데, 스택에 예를 들어 { 가 남아 있다면 그것은 오른쪽 }가 없다는 의미이므로 이것 또한 실패이다.

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

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 check_matching(const char *in)
{
    StackType s;
    char ch, open_ch;
    int i, n = strlen(in); // n은 문자열의 길이
    init_stack(&s); // 스택의 초기화

    for ( i=0; i<n;i++){
        ch = in[i]; //ch는 다음문자
        switch(ch){
            case '(': case '[': case '{':
                push(&s,ch);
                break;
            case ')': case ']': case '}':
                if (is_empty(&s)) return 0;
                else {
                    open_ch = pop(&s);
                    if ((open_ch == '(' && ch != ')') ||
                       (open_ch == '[' && ch != ']') ||
                       (open_ch == '{' && ch != '}')) {
                           return 0;
                    }
                break;
                }

        }
    }
    if (!is_empty(&s)) return 0; //스택이 남아있으면 오류
    return 1;
}

int main(void)
{
    char *p ="{A[i+1]=0;}";
    if (check_matching(p) == 1)
        printf("%s 괄호검사성공\n",p);
    else 
        printf("%s 괄호검사실패\n",p);
    return 0;
}

첫 게시물을 올리며: 기록으로 남기니까 뿌듯하기도 하고 재밌다.
앞으로도 양질의 문제를 풀면서 실력을 키워가야겠다.
파이팅입니다!

profile
안녕하세요

0개의 댓글