1. 스택

스택이란 주로 실행취소 기능을 사용할 때 자주 사용하는 자료구조로

가장 마지막에 입력된 값이 가장 먼저 출력되는 형태의 자료구조다.

 

스택 이미지

여기서 새로운 데이터를 넣는 것을 push

최상단에 어떤 데이터가 있는지 확인하는 것을 peek

데이터를 꺼내는 것을 pop

이라고 한다.

1-1. 구현

스택을 구현해보자

 

SIZE = 10
stack = [None for _ in range(SIZE)]
top = -1 # 초기값 바닥

stack

# 출력결과
# [None, None, None, None, None, None, None, None, None, None]

10칸 짜리 스택을 만들었다. SIZE 변수 값에 따라 칸이 결정되고 굳이 10개일 필요는 없다.

 

top += 1
stack[top] = '커피'
top += 1
stack[top] = '녹차'
top += 1
stack[top] = '꿀물'
stack

# 실행결과
# ['커피', '녹차', '꿀물', None, None]

Push를 통해 자료를 넣은 모습, 그러나 단순 배열처럼 보인다.

이해를 위해 for문을 사용하여 출력해보자

print('--스택상태--')
for i in range(len(stack)-1, -1, -1):
    print(stack[i])
print('-----------')

# 실행 결과
# --스택상태--
# None
# None
# 꿀물
# 녹차
# 커피
# -----------

이제 가장 먼저 들어간 커피가 최하단에 위치한 걸 볼 수 있다.

 

data = stack[top]
stack[top] = None
top -= 1
print(f'pop -> {data}')
print('--스택상태--')
for i in range(len(stack)-1, -1, -1):
    print(stack[i])
    
# pop -> 꿀물
# --스택상태--
# None
# None
# None
# 녹차
# 커피

pop을 구현해본 모습

최상단에 위치한 데이터가 출력된 모습을 확인할 수 있다.

 

if top == -1:
    print('더 이상 데이터가 없습니다.')
else:
    pass

예외처리로 만약 데이터가 없을 경우를 대비한 부분

 

전체 코드는 아래와 같다.

# 스택 전체 구현
# global 변수
SIZE = 0
stack = []
top = -1

# 스택이 꽉 찼는지 여부 확인
def isStackFull():
    global SIZE, stack, top # 전역변수를 그대로 함수에서도 쓸래!
    if(top >= SIZE -1):
        return True
    else:
        return False
    
# 스택이 비어있는지 여부 확인
def isStackEmpty():
    global SIZE, stack, top
    if(top == -1):
        return True
    else:
        return False
    
# 스택에 데이터 추가
def push(data):
    global SIZE, stack, top
    if (isStackFull()):
        print('Stack is Full')
        return
    else:
        top +=1
        stack[top] = data

def pop():
    global SIZE, stack, top
    if(isStackEmpty()):
        print('Stack is Empty!')
        return None
    else:
        data = stack[top]
        stack[top] = None
        top -= 1
        return data

# top의 데이터 확인
def peek():
    global SIZE, stack, top
    if isStackEmpty():
        print('Stack is Empty')
        return None
    else:
        return stack[top]

# 메인 엔트리
if __name__ == '__main__':
    top = -1
    SIZE = int(input('스텍사이즈 입력 >> '))
    stack = [None for _ in range(SIZE)]

    while True:
        select = input('삽입(I)/추출(E)/확인(V)/종료(X) >> ')
        if select.lower() == 'x': # 입력값 소문자로 변경, 종료
            break
        elif select.lower() == 'i': # 삽입
            data = input('추가할 데이터 >> ')
            push(data)
            print(f'스택상태 : {stack}')
        elif select.lower() == 'e': # 추출
            data = pop()
            print(f'추출 데이터 : {data}')
            print(f'스택상태 : {stack}')
        elif select.lower() == 'v': # 확인
            data = peek()
            print(f'확인 데이터 : {data}')
            print(f'스택상태 : {stack}')
        else: 
            continue

    print('스택 프로그램 종료')

 

+ Recent posts