[C언어] Stack&Queue(7) - balanced 함수 구현하기

2025. 4. 13. 22:20·크래프톤 정글/Code 정글(C언어)

Stack&Queue(7) - balanced 함수 구현하기

괄호 문자열이 올바르게 짝지어졌는지 확인하는 함수

주어진 요소 확인하기

구조체

  • Stack: (struct) 스택 구조체
    • ll: (LinkedList) 스택 연산 구현을 위한 연결 리스트 구조체
  • LinkedList: (struct) 연결 리스트 구조체
    • size: (int field) 연결 리스트 요소 갯수
    • *head: (pointer field) 연결 리스트 첫 노드의 주소
  • ListNode: (struct) 노드 구조체
    • item: (int field) 노드의 값
    • *next: (pointer field) 다음 노드의 주소

balanced 함수의 매개 변수

  • *expression: (pointer) 검사할 문자열의 문자 주소

 

핵심 아이디어

  • 올바른 괄호 문자열인 경우 result = 0(일치) / 아닌 경우 result = 1(불일치)
  • 문자가 널 문자일 때까지 문자열을 차례대로 순회
    • 문자가 여는 괄호인 경우 push
    • 문자가 닫는 괄호인 경우
      • 스택이 비어있는 경우 result = 1(불일치)
      • 스택 최상단의 문자와 짝을 이루는 경우 pop
      • 스택 최상단의 문자와 짝을 이루지 않는 경우 result = 1(불일치)
  • 모든 문자열 순회 후, 스택이 비어있지 않다면 result = 1(불일치)
  • 스택 해제 후 result 값을 반환

 

구현하기

int balanced(char *expression) {
    // 스택 생성 및 초기화 (괄호 쌍을 확인하기 위해 사용)
    Stack *s = malloc(sizeof(Stack));
    s->ll.head = NULL;
    s->ll.size = 0;

    char c, top;
    int i = 0;
    int result = 0;  // 0: balanced, 1: not balanced

    // 문자열의 각 문자를 순회
    while (*(expression + i)) {
        c = *(expression + i);

        // 여는 괄호는 스택에 push
        if (c == '(' || c == '{' || c == '[') {
            push(s, c);
        } else {
            // 닫는 괄호인데 스택이 비었으면 짝 불일치
            if (isEmptyStack(s)) {
                result = 1;
                break;
            }

            // 스택의 top 확인 후 짝이 맞으면 pop
            top = peek(s);
            if ((c == ')' && top == '(') ||
                (c == '}' && top == '{') ||
                (c == ']' && top == '[')) {
                pop(s);
            } else {
                // 닫는 괄호와 열린 괄호가 다르면 짝 불일치
                result = 1;
                break;
            }
        }
        i++;
    }

    // 반복문을 끝까지 돈 후에도 스택에 값이 남아 있다면 짝 불일치
    if (!result && !isEmptyStack(s)) {
        result = 1;
    }

    // 동적 할당된 스택 구조체 해제
    free(s);

    // 결과 반환 (0: balanced, 1: not balanced)
    return result;
}
저작자표시 비영리 변경금지 (새창열림)

'크래프톤 정글 > Code 정글(C언어)' 카테고리의 다른 글

[C언어] Binary Tree (1) - identical 함수 구현하기  (0) 2025.04.14
[C언어] 이진 트리(Binary Tree) 구현 실습하기  (0) 2025.04.14
[C언어] Stack&Queue(6) - removeUntilStack 함수 구현하기  (1) 2025.04.13
[C언어] Stack&Queue(5) - recursiveReverseQueue 함수 구현하기  (0) 2025.04.13
[C언어] Stack&Queue(4) - reverseQueue 함수 구현하기  (0) 2025.04.13
'크래프톤 정글/Code 정글(C언어)' 카테고리의 다른 글
  • [C언어] Binary Tree (1) - identical 함수 구현하기
  • [C언어] 이진 트리(Binary Tree) 구현 실습하기
  • [C언어] Stack&Queue(6) - removeUntilStack 함수 구현하기
  • [C언어] Stack&Queue(5) - recursiveReverseQueue 함수 구현하기
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기
      • 크래프톤 정글
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리)
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • 마이 정글(WIL, 에세이)
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[C언어] Stack&Queue(7) - balanced 함수 구현하기
상단으로

티스토리툴바