티스토리 뷰

Algorithm/Basic

[Algorithm] 스택

feVeRin 2024. 3. 21. 14:55
반응형

* Python을 기준으로 합니다


스택 (Stack)

- 개념

  • 스택 : LIFO (Last In First Out) 형태의 자료구조
    • 처음 실행했던 위치로 돌아가기 위해 이전 실행들을 쌓아서 관리하는 용도
    • 삽입과 삭제를 핵심 연산으로 가짐
  • 스택의 주요 연산
    • `push()` : 새로운 데이터를 스택의 맨 위에 추가
    • `pop()` : 스택의 맨 위에 위치한 데이터를 꺼내서 반환
    • `isEmpty()` : 스택이 비어있으면 `True`, 아니면 `False`
    • `peek()` : 스택 맨 위에 위치한 데이터를 확인
  • Python에서의 스택 활용
    1. 일반적으로 리스트를 스택처럼 활용
      • Python 리스트의 `append(), pop()`은 각각 `push(), pop()`에 대응
      • `isEmpty()`의 경우 리스트의 length를 활용 `len(stack) == 0`
      • `peek()`는 리스트의 slicing으로 접근할 수 있음 `stack[-1]`
    2. `queue` library를 import 하는 방법
      • 해당 library를 import 하면 `import queue`
      • 스택은 `LifoQueue()`로써 제공됨 `stack = queue.LifoQueue()`
      • 삽입 : `put()`, 삭제 : `get()`, 스택 상태 : `empty()`

- 구현

1. 배열을 통한 구현

  • Python의 배열 구조에 해당하는 리스트를 활용함
stack = []

#stack 상태 확인
print(len(stack)==0) #True

#데이터 삽입
stack.append(1)
stack.append(2)
stack.append(3)
print(stack)# [1,2,3]
print(len(stack)==0) #False

#데이터 삭제
stack.pop()
print(stack) #[1,2]
stack.pop()
print(stack) #[1]

2. 연결 리스트를 통한 구현

class Node: #linked list node
    def __init__(self, data):
        self.data = data
        self.link = None

class Stack: #stack 
    def __init__(self):
        self.top = None

    def push(self, data):
        prev = self.top
        self.top = Node(data)
        self.top.link = prev

    def pop(self):
        pop = self.top.data
        self.top = self.top.link
        return pop

    def peak(self):
        return self.top.data
    
    def isEmpty(self):
        if self.top == None:
          return True
        else:
          return False
  • 결과 확인
s = Stack()

print(s.isEmpty()) #True

#push
s.push(1)
s.push(2)
s.push(3)

print(s.peak()) #3
print(s.isEmpty()) #False

#pop
for _ in range(3):
  print(s.pop(), end=' -> ') #3 -> 2 -> 1 -> None
print('None')

 

반응형

'Algorithm > Basic' 카테고리의 다른 글

[Algorithm] 해시 테이블  (0) 2024.03.24
[Algorithm] 큐, 덱  (0) 2024.03.22
[Algorithm] 연결 리스트  (0) 2024.03.20
[Algorithm] 배열  (0) 2024.03.19
[Algorithm] 문자열  (0) 2024.03.18
댓글
최근에 올라온 글
최근에 달린 댓글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday