후입 선출의 LIFO라고 부르기도 하는데요. 이는 'Last in First Out'의 준말입니다.
스택을 다루는 연산들.
스택의 상단에 새로운 요소를 삽입하는 연산과 삭제하는 연산 크게 두 개를 볼 수 있습니다.
하나씩 삽입해서 넣고 뺀다는 의미로
넣을 때는 : PUSH
뺄 때는 : POP
이라고 부릅니다.
스택의 추상 자료형들
stack() : 비어있는 새로운 스택을 만든다
isEmpty(): 스택이 비어있으면 True를 아니면 False를 반환한다.
Push(e) : 항목 e를 스택의 맨 위에 추가한다.
pop() : 스택의 맨 위에 있는 항목을 거네 반환한다.
peek() : 스택의 맨 위에 있는 항목을 삭제하지 않고 반환한다.
size() : 스택 내의 모든 항목의 개수를 반환한다.
clear() : 스택을 공백상태로 만든다.
배열을 이용해서 스택을 구현
- 데이터
top :스택 항목을 저장하는 파이썬 리스트
항목의 개수는 len(top)으로 구할 수 있음
- 연산
isEmpty(), push(), pop(), peek(), display()
항목 삽입/삭제 위치 : 리스트의 맨 뒤가 유리함 어째서?
스택의 함수 구현
top = [] #스택의 항목들을 담을 공백 리스트
def isEmpty():
return len(top) == 0
def push(item) :
top.append(item) #리스트의 맨 뒤에 item을 추가
def pop():
if not isEmpty(): #공백상태가 아니면
return top.pop(-1) #리스트의 맨 뒤에서 항목을 하나 꺼내고 반환해준다.
def peek():
if not isEmpty(): #공백상태가 아니면
return top[-1] #맨 뒷 항목을 반환(삭제하지 않음)
def size(): return len(top) #스택의 크기
def clear():
global top #top은 전역변수로 지정
top = [] #스택의 초기화
스택의 클래스 구현 (함수로 하면 되는데, 왜 클래스로 해요?)
스택을 한 번만 사용할 거면 함수로 해도 되지만, 여러 개의 스택을 활용해야 할 경우에는 클래스를 활용하는 거야.
스택을 만들 때마다 함수를 만들어 줄 수는 없으니까.
class Stack:
def__init__(self) :
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):
if not self.isEmpty():
return self.top[-1]
그럼 스스로 숫자 1~10까지 차례대로 짝수 스택과 홀 수 스택에 넣는 코드를 작성해보자~~~