Programming 기초/Python

[Python 자료구조 #스택1] 소스 파일에서 괄호 검사

코딩상륙작전 2023. 5. 6. 03:54

1. 스택을 클래스로 구현하고

2. 파일 내에서 괄호를 검사하는 checkBracketsV2() 함수를 정의.

3. 파일을 읽기모드로 열어서 줄 단위로 리스트를 만들고

4. 만들어진 리스트에 checkBracketsV2() 함수를 호출하여 검사한다.

 

아래 코드블럭에서는 소스파일 대신  txt파일을 불러왔다.

class Stack:
    def __init__(self):
        self.top = []

    def __str__(self):
        return str(self.top)

    def isEmpty(self):
        return len(self.top) == 0

    def size(self):
        return len(self.top)

    def clear(self):
        self.top = []

    def push(self, item):
        self.top.append(item)

    def pop(self):
        if not self.isEmpty():
            return self.top.pop(-1)

    def peek(self):  # peek 메소드는 맨 뒤의 항목을 삭제하지 않고 반환한다
        if not self.isEmpty():
            return self.top[-1]


def checkBracketsV2(lines):

    # 스택 준비
    stack = Stack()

    # 입력 문자를 하나씩 읽어 왼쪽 괄호를 만나면 스택 저장
    for line in lines:	# 모든 줄 중에 한 줄씩
        for ch in line:	# 한 줄 중에 한 글자씩 
            if ch in ('{', '[', '('):  # ch 가 {, [, ( 에 포함된다면
                stack.push(ch)  # 스택에 값 삽입
            elif ch in ('}', ']', ')'):  # ch 가 }, ], )에 포함된다면
                if stack.isEmpty():  # 스택이 공백인지 확인
                    return False    # 공백이면 false 반환
                else:  # 공백이 아니라면
                    pop_result = stack.pop()  # 스택의 맨 마지막 값 꺼내기
                    if ((ch == ')' and pop_result != '(') or
                        (ch == '}' and pop_result != '{') or
                            (ch == ']' and pop_result != '[')):
                        return False
    return stack.isEmpty()


filename = "text.txt"   # 괄호를 검사할 소스 파일
infile = open("C:/coding/"+filename, "r", encoding="UTF-8")   # 파일 열기
lines = infile.readlines()  # 파일 전체를 라인별로 읽은 리스트
infile.close()  #파일 닫기

result = checkBracketsV2(lines) # 검사 함수 호출
print(filename, "--->", result) # 결과 출력

실제 소스파일의 괄호를 검사하는 프로그램을 만든다고 하면  checkBracketsV2()로는 역부족이다.

소스파일 특성상 검사할 필요가 없는 설명글(#)을 포함한 모든 글자를 검사하기에 설명글에서 'FALSE' 판정을 받을 수도 있기 때문이다. (문자열 내의 글자도 마찬가지로 검사할 필요가 없음에도 검사 대상이 된다.)