ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python 자료구조 #스택1] 소스 파일에서 괄호 검사
    Programming 기초/Python 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' 판정을 받을 수도 있기 때문이다. (문자열 내의 글자도 마찬가지로 검사할 필요가 없음에도 검사 대상이 된다.)

     

     

     

     

     

    댓글

Designed by Tistory.