A. 스택(Stack) 개념
1) 한 쪽 끝이 막힌 형태
Ex) 프링글스 과자 통
2) 먼저 들어간 데이터가 가장 나중에 나오는 구조(선입후출, 후입선출)
B. 스택(Stack) 원리
1) 스택(Stack) 기본 구조
i. 스택(Stack)에 데이터를 삽입하는 작동: push
ii. 스택(Stack)에 데이터를 추출하는 작동: pop
iii. 스택(Stack)에 들어 있는 가장 위의 데이터: top
C. 스택(Stack)에 데이터 삽입: push
D. 스택(Stack)에 데이터 추출: pop
E. 스택(Stack) 실습
1. 스택(Stack)에 데이터 삽입
i. 크기가 5개인 스택(Stack) 생성
ii. 스택(Stack)의 top 위치에 데이터 삽입
iii. top += 1을 하며 스택(Stack) top 위치를 지속적으로 갱신해줌
iv. for문을 통해 스택(Stack) 출력
stack = [None, None, None, None, None]
top = 0
stack[top] = '커피'
top += 1
stack[top] = '녹차'
top += 1
stack[top] = '꿀물'
top += 1
print('---- Stack Status ----')
print(stack)
# 출력 예시) ---- Stack Status ----
# 출력 예시) 커피 녹차 꿀물 None None
2. 스택(Stack)에 데이터 추출
i. 스택의 top 위치에 데이터를 data라는 변수에 저장
ii. 추출한 top Data의 위치를 None으로 바꿈
iii. 스택(Stack)의 top 위치를 바로 아래 데이터로 바꿈
iv. for문을 통해 스택(Stack) 출력
stack = ['커피', '녹차', '꿀물', None, None]
top = 2
# stack의 top 데이터를 추출
data = stack[top]
# stack의 top 데이터를 추출했으므로 해당 자리는 None으로 만듬
stack[top] = None
# top Data를 변경
top -= 1
print(end = '\n')
print('pop -->', data, end = '\n')
print(end = '\n')
print('---- Stack Status ----', end = '\n')
print(stack)
# 출력 예시) pop --> 꿀물
# 출력 예시) ---- Stack Status ----
# 출력 예시) 커피 녹차 None None None
3. 스택(Stack) 초기화
i. stack 변수를 다시 선언해 초기화하는 방법
stack = [None, None, None, None, None]
ii. stack을 한 줄 for문을 사용하여 초기화하는 방법
size = 5
stack = [None for _ in range(size)]
top = -1
4. 스택(Stack)이 꽉 찼는지 확인하는 함수
i. global을 통해 전역변수를 불러옴
ii. if문을 통해 top Data가 스택(Stack) 크기보다 작을 경우 True 값 반환
iii. 그 외의 값들은 False로 반환
def Stack_is_Full() :
global size, stack, top
if(top >= size-1) :
return True
else :
return False
size = 5
stack = ['커피', '녹차', '꿀물', '콜라', '환타']
top = 4
print('스택(Stack)이 다 찼나요? ==>', Stack_is_Full())
# 출력 예시) 스택(Stack)이 다 찼나요? ==>' True
5. 스택(Stack )에 데이터를 삽입하는 함수
i. global을 통해 전역변수를 불러옴
ii. if문을 통해 스택(Stack)이 꽉 찼는지 확인
iii. top += 1을 해 None으로 되어있는 자리를 top Data로 만들어줌
iv. stack[top]의 위치에 data 값 저장
# Stack_is_Full() 함수는 위 코드와 동일
def push(data) :
global size, stack, top
if Stack_is_Full() :
print('스택(Stack)이 꽉 찼습니다.')
return
top += 1
stack[top] = data
size = 5
stack = ['커피', '녹차', '꿀물', '콜라', None]
top = 3
print(stack)
push('환타')
print(stack)
push('게토레이') # Stack is Full
# 출력 예시) 커피 녹차 꿀물 콜라 None
# 출력 예시) 커피 녹차 꿀물 콜라 환타
# 출력 예시) 스택(Stack)이 꽉 찼습니다.
6. 스택(Stack)이 비었는지 확인하는 함수
i. global을 통해 전역변수를 받아옴
ii. if문을 통해 top Data가 -1 자리라면 True값 반환, 그 외는 False 값 반환
iii. 빈 스택(Stack) 생성
def Stack_is_Empty() :
golbal size, stack, top
if top == -1 :
return True
else :
return False
size = 5
stack = [None for _ in range(size)]
top = -1
print('스택(Stack)이 비었나요? ==>', Stack_is_Empty())
# 출력 예시) 스택(Stack)이 비었나요? ==> True
7. 스택(Stack)에서 데이터를 추출하는 함수
i. global을 통해 전역변수를 받아옴
ii. if문을 통해 스택(Stack)이 비었는지 확인
iii. 비어 있지 않다면 data 변수에 top Data 저장
iv. 스택(Stack) top Data를 None으로 변경, top -= 1을 통해 top Data 갱신
# Stack_is_Empty() 함수는 위 코드와 동일
def pop() :
global size, stack, top
if Stack_is_Empty() :
print('스택(Stack)이 비었습니다.')
return None
data = stack[top]
stack[top] = None
top -= 1
size = 5
stack = ['커피', None, None, None, None]
top = 0
retData = pop()
print('추출한 데이터 ==>', retData)
print(stack)
retData = pop() # Stack_is_Empty()
# 출력 예시) 추출한 데이터 ==> 커피
# 출력 예시) None None None None None
# 출력 예시) 스택(Stack)이 비었습니다.
F. 데이터 확인
1. top 위치의 데이터를 확인만 하고 스택에 그대로 두는 것: peek(픽)
2. peek 실습
i. global을 통해 전역변수를 받아옴
ii. if문을 통해 스택(Stack)이 비었는지 확인
iii. 스택(Stack)이 비어있지 않다면, 스택(Stack)의 top Data를 반환해줌
# Stack_is_Empty() 함수는 위 코드와 동일
def peek() :
global size, stack, top
if Stack_is_Empty() :
print('스택(Stack)이 비었습니다.')
return None
return stack[top]
size = 5
stack = ['커피', '녹차', '꿀물', None, None]
top = 2
retData = peek()
print('top의 데이터 확인 -->', retData)
print(stack)
# 출력 예시) top의 데이터 확인 --> 꿀물
# 출력 예시) 커피 녹차 꿀물 None None