자료구조 - 스택 보충

hyuckhoon.ko·2020년 5월 20일
0

What I learned in wecode

목록 보기
25/109

예전에 작성한 스택 내용을 다시 정리해본다.

괄호 오류를 찾아내는 프로그램

1. 코드설명

# | 괄호 오류 체크 프로그램 |


# 괄호 에러 체크하는 클래스 정의
class Syntax_check():
    # 괄호 정의
    opening_brace = ['(', '{', '[' ]
    closing_brace = [')', '}', ']' ]

    # 스택 리스트 초기화
    def __init__(self):
        self.stack_list = []

    def error_check(self, sentence):
        sentence = list(sentence)
        for letter in sentence:
            # 여는 괄호가 입력되면 stack에 넣는다.
            if letter in self.opening_brace:
                self.stack_list.append(letter)

            # 닫는 괄호가 입력되었을 때
            elif letter in self.closing_brace:

                # ')' 괄호가 입력됐다면    
                if letter == self.closing_brace[0] and self.stack_list:
                    self.stack_list.pop()

                # '}' 괄호가 입력됐다면
                elif letter == self.closing_brace[1] and self.stack_list:
                    self.stack_list.pop()

                # ']' 괄호가 입력됐다면    
                elif letter == self.closing_brace[2] and self.stack_list:
                    self.stack_list.pop()     

                else:
                    # '닫는 괄호' 먼저 사용된 경우
                    print("에러 원인 -> ", letter)
                    return 0         
        
        letter = None
        # 스택에 여는 괄호가 남았다면, 괄호 짝의 개수 불일치 경우
        length = len(self.stack_list)
        if self.stack_list:
            print("여는 괄호가 남았습니다.")
            return self.stack_list

        # 스택에 여는 괄호가 없고, 닫는 괄호가 남아있을 경우
        else:
            if letter == self.closing_brace[0]:
                return 4
            elif letter == self.closing_brace[1]:
                return 5
            elif letter == self.closing_brace[2]:
                return 6
            else:
                return 7
            



# (main) 프로그램 시작!
# 괄호 에러 체크하는 클래스 선언
syntax_check = Syntax_check()   
 
# 사용자 입력란 : '' 사용할 것.
user_input = 'list = [random.randrange(1, 10,1 ) for _ in range(10)]'

# 에러 체크 함수 구동
result = syntax_check.error_check(user_input)

# 결과 판별
if result == 0:
    print("여는 괄호 수정 필요")
elif result == 1:
    print("( ) 괄호 사용 실수" )
elif result == 2:
    print("{ } 괄호 사용 실수" )
elif result == 3:
    print("[] 괄호 사용 실수" )
elif result ==4:
    print("("" 괄호 수정 필요")
elif result ==5:
    print("{"" 괄호 수정 필요")
elif result ==6:
    print("["" 괄호 수정 필요")    
elif result == 7:
    print("괄호 사용 문제없습니다.")
else:
    print(result, "여는 괄호 수정 필요")



2. 코드설명 (스택)

< 클래스 정의 >

class Syntax_check():
    # 괄호 정의
    opening_brace = ['(', '{', '[' ]
    closing_brace = [')', '}', ']' ]

    # 스택 리스트 초기화
    def __init__(self):
        self.stack_list = []

클래스명은 'Syntax_check' 다.

  • 입력된 letter가 opening_brace 리스트에 있으면 스택에 push
  • 입력된 letter가 closing_brace리스트에 있으면 스택에 push



< 클래스 안에 에러를 체크하는 메소드 정의 >

메소드 이름 : error_check

def error_check(self, sentence):
        sentence = list(sentence)

sentence를 입력받으면,
str -> list로 변환함으로써
향후 반복문으로 하나하나의 문자에 접근할 수 있도록 했다.


  
for letter in sentence:
   
 # [1] 여는 괄호가 입력되면 stack에 넣는다.
 if letter in self.opening_brace:
    self.stack_list.append(letter)

 # [2] 닫는 괄호가 입력되었을 때
 elif letter in self.closing_brace:

   # 1) ')' 괄호가 입력됐다면    
   if letter == self.closing_brace[0] and self.stack_list:
      self.stack_list.pop()

    # 2) '}' 괄호가 입력됐다면
    elif letter == self.closing_brace[1] and self.stack_list:
       self.stack_list.pop()

    # 3) ']' 괄호가 입력됐다면    
    elif letter == self.closing_brace[2] and self.stack_list:
       self.stack_list.pop()  
       
     (중략)      

스택에는 여는 괄호 (, {, [ 만 입력되고

닫는 괄호는 letter로 들어온다.(반복문)

letter가 '}'이고, 스택의 가장 바깥 데이터가 '{'임이 확인되면

스택의 '{'를 삭제한다.

이러한 과정으로 프로그램이 작동된다.



<이제 프로그램이 작동되는가?>

아니다.

두 가지 케이스가 남아있다.

1) 스택이 남아있는 경우

즉, 여는 괄호가 필요 이상으로 들어간 경우다.

2) 스택은 empty인데, 닫는 괄호가 남아있는 경우다.

닫는 괄호가 필요 이상으로 들어간 경우다.



판별하는 부분은 좀 더 검증이 필요하다.
완료 후 재업로드 내용 보충 예정

0개의 댓글