최초 작성일: 10/23 최초 작성
스택은 선입후출(LIFO, Last In First Out)이자 후입선출(FILO, First In Last Out)을 특징으로 합니다.
Fig 1. 스택의 기본 구조 |
---|
![]() |
출처: geeksforgeeks.com |
스택의 종류
고정 크기 스택(Fixed Size Stack)
말 그대로, 스택이 크기가 자바 배열처럼 고정되어 있다고 보면 편합니다. 스택이 가득 차 있다면 오버플로우를, 스택이 비어있다면 언더플로우를 고려해야 합니다.
동적 크기 스택(Dynamic Size Stack)
요소의 추가나 삭제에 따라 스택의 크기가 줄어들거나 늘어날 수 있습니다. 연결 리스트(linked list)를 이용해 구현할 수 있습니다.
💡 스택에서 최상위 요소가 항상 가장 나중에 들어온 요소임을 고려하면 이해가 쉽습니다.
push()
pop()
peek()
isEmpty()
size()
push(), pop(), top(), isEmpty(), size() 모두: O(1)
/* 코드는 수정될 수 있으며,
참고한 코드는 참고자료 항목에 작성해두었습니다.
코드는 수정될 수 있습니다.
최초 작성일(yy/mm/dd): 2024/01/06
최종 수정일(yy/mm/dd): 2024/01/06 */
class ArrayStack<T> {
private T[] elements;
private int top;
public ArrayStack(int initialCapacity) {
elements = (T[]) new Object[initialCapacity];
top = -1;
}
public boolean isEmpty() {
return (top == -1);
}
public boolean isFull() {
return (top == elements.length-1);
}
public void push(T theElement) {
if (isFull()) {
throw new IllegalStateException("Stack is full");
} else {
top++;
elements[top] = theElement;
}
}
public T pop() {
if (isEmpty()) {
throw new IllegalStateException("Stack is empty");
} else {
T removedElement = elements[top];
elements[top] = null;
top--;
return removedElement;
}
}
public T peek() {
if (isEmpty()) return null;
return elements[top];
}
public int size() {
return top+1;
}
}
/* 코드는 수정될 수 있으며,
참고한 코드는 참고자료 항목에 작성해두었습니다.
코드는 수정될 수 있습니다.
최초 작성일(yy/mm/dd): 2024/01/06
최종 수정일(yy/mm/dd): 2024/01/06 */
class ListStack<T> {
private Node<T> top;
private int size;
private static class Node<T> {
T data;
Node next;
Node(T data) {
this.data = data;
this.next = null;
}
}
public ListStack() {
this.top = null;
this.size = 0;
}
public boolean isEmpty() { return size == 0; }
public void push(T theElement) {
Node<T> newNode = new Node<>(theElement);
newNode.next = top;
top = newNode;
size++;
}
public T pop() {
if (isEmpty()) {
throw new IllegalStateException("Stack is empty");
}
T removedElement = top.data;
top = top.next;
size--;
return removedElement;
}
public T peek() {
if (isEmpty()) {
throw new IllegalStateException("Stack is empty");
}
return top.data;
}
public int size() {
return size;
}
}