상세 컨텐츠

본문 제목

알고리즘 Python 스택(Stack)

카테고리 없음

by 복습하는 programmer 2022. 10. 24. 03:23

본문

A. 스택(Stack) 개념

   1) 한 쪽 끝이 막힌 형태

      Ex) 프링글스 과자 통

   2) 먼저 들어간 데이터가 가장 나중에 나오는 구조(선입후출, 후입선출)

 

B. 스택(Stack) 원리

   1) 스택(Stack) 기본 구조

      i. 스택(Stack)에 데이터를 삽입하는 작동: push

     ii. 스택(Stack)에 데이터를 추출하는 작동: pop

    iii. 스택(Stack)에 들어 있는 가장 위의 데이터: top

 

C. 스택(Stack)에 데이터 삽입: push

 

push 참고 이미지

 

D. 스택(Stack)에 데이터 추출: pop

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