[자료구조] 8. 스택 (Stacks)
스택 (Stacks)
스택이란 자료를 순차적으로 보관할 수 있는 선형구조이다.
- 스택은
후입선출(LIFO, Last-In First-Out)
형식의 구조를 가지고 있다.- 후입선출: 가장 최근에 들어온 데이터가 가장 먼저 나가는 데이터 관리 방식이다.
- 후입선출 구조를 수행하기위해 스택은
push
,pop
을 통해 데이터를 관리한다.
push: 스택에 데이터를 추가
pop: 스택에서 가장 최근에 추가된 데이터를 제거
- 스택에서는 다음과 같은 오류가 발생할 수 있다.
- Stack Underflow: 꺼낼 데이터가 없는데 꺼내려고 시도할 때 발생하는 오류
- Stack Overflow: 스택이 꽉차 있는 상태에서 데이터 원소를 넣으려고 시도할 때 발생하는 오류
- 스택은
스택의 추상적 자료구조 구현
(1) 연산의 정의
size()
: 스택에 들어있는 데이터 원소의 수를 구한다.isEmpty()
: 스택이 비어있는지 확인한다.push(x)
: 스택에 데이터 원소 x를 스택에 추가한다.pop()
: 스택의 맨 위에 저장된 데이터 원소를 제거하고 반환한다.peek()
: 스택의 맨 위에 저장된 데이터 원소가 무엇인지 확인한다.
(2) 배열(Array)를 이용하여 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class ArrayStack:
def __init__(self):
self.data = [] # 빈 스택을 초기화
def size(self):
return len(self.data) # 스택의 크기를 리턴
def isEmpty(self):
return self.size()==0 # 스택이 비어 있는지 판단
def push(self, item):
self.data.append(item) # 데이터 원소를 추가
def pop(self):
self.data.pop() # 데이터 원소를 삭제 (리턴)
def peek(self):
return self.data[-1] # 스택의 꼭대기 원소 반환
(3) 양방향 연결리스트 (Doubly Linked List)를 이용하여 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 노드, 양방향연결리스트의 모듈 코드는 이전 포스팅을 참고 부탁드립니다.
from utils_practice.node_v2 import Node
from utils_practice.linkedlist_v2 import DoublyLinkedList
class LinkedListStack:
def __init__(self):
self.data = DoublyLinkedList() # 빈 스택을 초기화
def size(self):
return self.data.nodeCount # 스택의 크기를 리턴
def isEmpty(self):
return self.size() == 0 # 스택이 비어 있는지 판단
def push(self, item):
node = Node(item)
self.data.insertAt(self.size() + 1, node) # 데이터 원소를 추가
def pop(self):
return self.data.popAt(self.size()) # 데이터 원소를 삭제 (리턴)
def peek(self):
return self.data.getAt(self.size()).data # 스택의 꼭대기 원소 반환
(4) 파이썬 라이브러리
스택은 굉장히 많이 사용되는 알고리즘이기에 파이썬 라이브러리 형태로도 존재한다.
1
from pythonds.basic.stack import Stack
References
This post is licensed under CC BY 4.0 by the author.