[자료구조] 스택의 응용 - 괄호 검사 문제

2024. 1. 15. 07:09·Computer Science/Data Structure

스택(Stack)의 응용 - 괄호 검사 문제


괄호 검사 문제

  • 프로그램에서 괄호들의 쌍이 올바르게 사용되었는지를 판단하는데 스택을 이용

  • 괄호의 검사 조건 3가지

    • 왼쪼 괄호의 개수와 오른쪽 괄호의 개수가 같아야 한다.

    • 같은 종류의 괄호에서 왼쪽 괄호는 오른쪽 괄호보다 먼저 나와야 한다.

    • 서로 다른 종류의 왼쪽 괄호와 오른쪽 괄호 쌍은 교차하면 안 된다.

    • example

      • { A [(i + 1)] = 0; } // 오류 X

      • if ((i == 0) && (j == 0) // 오류 : 조건 1 위반

      • A [ (i + 1] ) = 0; // 오류 : 조건 3 위반

  • 의사 코드

    check_matching(expr):
    
    while (입력 expr이 끝이 나면):
      ch <- expr의 다음 글자
      switch(ch):
        case '(' : case '[' : case '{':
          ch를 스택에 삽입
          break;
        case ')' : case ']' : case '}':
          if (스택이 비어 있으면)
            then 오류
          else 스택에서 open_ch를 꺼낸다
            if (ch와 open_ch와 같은 짝이 아니다면)
              then 오류 보고
          break;
      if (스택이 비어있지 않으면)
        then 오류
  • C Program

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX_STACK_SIZE 100
    
    typedef char element;        // 교체!
                  // 차후에 스택이 필요하면 여기만 복사하여 붙인다. 
                  // ===== 스택 코드의 시작 ===== 
    #define MAX_STACK_SIZE 100
    
    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];
        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;
    }

참조) C언어로 쉽게 풀어 쓴 자료구조(천인국, 2016, 생능출판사)

'Computer Science > Data Structure' 카테고리의 다른 글

[자료구조] 스택의 응용 - 미로 탐색  (0) 2024.01.15
[자료구조] 스택의 응용 - 후위 표기 수식의 계산  (0) 2024.01.15
[자료구조] 스택(Stack)  (0) 2023.12.31
[자료구조] 배열의 응용 : 희소행렬  (0) 2023.12.26
[자료구조] 배열의 응용 : 다항식  (0) 2023.12.26
'Computer Science/Data Structure' 카테고리의 다른 글
  • [자료구조] 스택의 응용 - 미로 탐색
  • [자료구조] 스택의 응용 - 후위 표기 수식의 계산
  • [자료구조] 스택(Stack)
  • [자료구조] 배열의 응용 : 희소행렬
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (456)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (129)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (5)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[자료구조] 스택의 응용 - 괄호 검사 문제
상단으로

티스토리툴바