스택(Stack)은 한 쪽 끝에서만 접근하여 데이터를 넣고 뺄 수 있는 후입선출(LIFO) 형태의 선형 자료구조이다. 비유하자면 빨래통과 같다 🧺
가장 처음 넣은 빨래는 가장 늦게 나오고, 가장 마지막에 넣은 빨래는 가장 빨리 나온다. 새로운 빨래를 넣는다면 먼저 들어간 빨래보다 위에 쌓이는 형태일 것이다.
스택(Stack)은 LIFO/FILO 순서를 따른다
LIFO : 마지막에 들어온 값이 처음으로 나가는 것
FILO : 처음 들어온 값이 마지막에 나가는 것
스택(Stack)은 시간 순서에 따라 데이터가 쌓이므로
가장 마지막에 삽입된 데이터가 가장 먼저 삭제된다는 특징을 가진다.
스택(Stack)에 데이터를 삽입하면 가장 마지막 부분(최상단)에 삽입된다.
스택에 데이터를 삽입하는 push는 인덱스를 증가하면서 이루어진다.
스택(Stack)에 데이터를 삭제하는 작업은 가장 위에 있는(가장 마지막에 추가된 데이터) 데이터를 제거한다.
데이터 제거에서 중요한 것은 스택이 비어있어 삭제할 데이터가 없는 경우이다.
isEmpty()는 Stack이 비어있는지 확하는 메서드이다.
스택이 비어 있으면 True, 데이터가 있으면 False를 반환한다.
#Node, Stack
class Node: # 어떤 값을 가져야하고 가리키는 것이 무엇인지로 구성
def __init__(self,item,next):
self.item = item
self.next = next
class Stack: # 제일 처음 탑을 지정, 스택을 처음 만들었을 땐 아무것도 없으니 None
def __init__(self):
self.top = None
def push(self,val): # 탑을 노드로 지정
self.top = Node(val,self.top) # 노드에 가지고 있는 값을 넣어줌
# 새로 만든 탑이 가리키고 있는 것이 기존의 탑
def pop(self): #
if not self.top: #만약에 self에 top이 비어있다면
return None
# None을 리턴
# 있다면 , 그게 아니라면
node = self.top # 탑을 꺼내기
self.top = self.top.next # 탑을 교체
# 제일 마지막(위)에 있는 자료의 다음을 새로운 top으로 지정
return node.item # 노드에 값을 반환
def is_empty(self):
return self.top is None
# top이 None인지 아닌지 판단 후 넘겨줌
def is_valid_parenthesis(s):
pair = {
'}': '{',
')': '(',
']': '[',
}
opener = "({["
stack = []
for char in s: # s를 쭉 순회하며
if char in opener: # s가 여는 녀석이면 stack에 append
stack.append(char)
else: # 그게 아니라면, 닫는 녀석이 나왔다면 -> 스택에 맨 위의 것과 쌍이 맞아야 함
if not stack: # 스택이 비어있다면 ( 짝이 안맞다 )
return False # False로 끝내기
top = stack.pop() # 그게 아니고, 짝의 개수가 맞다면 제일 위에 있는 것을 꺼내서 그것이
if pair[char] != top: # 와야 하는 것과 다르다면
return False # False로 끝내기
return not stack
# 소진되지 않고 여전히 남아있다면 / 스택이 비었는지 안비었는지만 검사해서 반환