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' 판정을 받을 수도 있기 때문이다. (문자열 내의 글자도 마찬가지로 검사할 필요가 없음에도 검사 대상이 된다.)