스택
스택은 가장 나중에 들어온 데이터가 가장 먼저 나가는 것으로 LIFO(Last-In-First-Out)이라고 한다.
자료구조에서 스택은 push()함수로 데이터를 삽입하고 pop()함수로 데이터를 삭제합니다.
파이썬으로 스택을 구현하기 위해 리스트를 사용하여 구현해 볼수 있습니다.
스택의 push()는 리스트의 append()함수를 이용하여 데이터를 삽입합니다.
스택의 pop()은 리스트의 pop()함수를 이용하여 데이터를 삭제합니다.
예제] 스택에 A, B, C를 삽입하고 pop()을 통해 두개의 데이터를 삭제해 보자.
stack = [] stack.append('A') stack.append('B') stack.append('C') print("스택의 모든 데이터 출력") for i in range(0, len(stack)): print("stack[%d] = %c" %(i, stack[i])) print("스택의 데이터 삭제") stack.pop() for i in range(0, len(stack)): print("stack[%d] = %c" %(i, stack[i])) print("스택의 데이터 삭제") stack.pop() for i in range(0, len(stack)): print("stack[%d] = %c" %(i, stack[i])) |
실행결과] 스택의 모든 데이터 출력 stack[0] = A stack[1] = B stack[2] = C 스택의 데이터 삭제 stack[0] = A stack[1] = B 스택의 데이터 삭제 stack[0] = A |
예제1]
class Stack: def __init__(self): self.items = [] def isEmpty(self): return not self.items def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def showdata(self): for i in range(len(self.items)): print("data : %c" %(self.items[i])) test = Stack() print(test) print(test.isEmpty()) print("데이터 삽입") test.push('A') test.push('B') test.push('C') print("데이터 출력") test.showdata() print("데이터 삭제") print(test.pop()) print(test.pop()) print(test.isEmpty()) print(test.pop()) print(test.isEmpty()) |
실행결과] True 데이터 삽입 데이터 출력 data : A data : B data : C 데이터 삭제 C B False A True |
예제2]
class Stack: #리스트를 이용하여 스택 생성 def __init__ (self): self.top = [] #스택의 크기를 출력 def __len__(self): return len(self.top) #스택 내부 자료를 string으로 변환하여 반환 def __str__(self): return str(self.top[::1]) #스택 초기화 def clear(self): self.top=[] #PUSH def push (self, item): self.top.append(item) #POP def pop(self): #if Stack is not empty if not self.isEmpty(): #pop and return return self.top.pop(-1) else: print("Stack underflow") exit() #자료가 포함되어 있는지 여부 반환 def isContain(self, item): return item in self.top #스택에서 top의 값을 읽어온다 def peek(self): if not self.isEmpty(): return self.top[-1] else: print("underflow") exit() #스택이 비어있는지 확인 def isEmpty(self): return len(self.top)==0 #스택 크기 반환 def size(self): return len(self.top) test = Stack() print(test) print(test.isEmpty()) print("데이터 삽입") test.push('A') test.push('B') test.push('C') print("현재 스택의 위치 데이터 : ", test.peek()) test.push('D') print("현재 스택의 위치 데이터 : ", test.peek()) print('스택 크기 : ', test.size()) print("데이터 출력") print(test.__str__()) print("A 데이터가 있는지 확인 : ", test.isContain('A')) print("S 데이터가 있는지 확인 : ", test.isContain('S')) print("데이터 삭제") print(test.pop()) print(test.pop()) print(test.isEmpty()) print(test.pop()) print(test.isEmpty()) |
실행결과] [] True 데이터 삽입 현재 스택의 위치 데이터 : C 현재 스택의 위치 데이터 : D 스택 크기 : 4 데이터 출력 ['A', 'B', 'C', 'D'] A 데이터가 있는지 확인 : True S 데이터가 있는지 확인 : False 데이터 삭제 D C False B False |