스택(Stack)이란, 어떤 데이터를 쌓아 올린 형태의 자료구조이다.
박스 안에 책을 쌓아두고, 꺼내는 행위를 스택의 구조와 연산들과 대비해 생각해보면 됩니다.
후입선출( Last In First Out, LIFO ) 자료구조
데이터가 입력된 순서의 역순으로 처리되어야 할 때 사용합니다.
스택이 비어있을 때 데이터를 꺼내려는 시도를 하면 스택 언더플로우(Stack Underflow)가 발생하며
스택이 꽉 차 있을때 데이터를 넣으려는 시도를 하면 스택 오버플로우(Stack Overflow)가 발생하게 됩니다.
자바에서는 java.util.Stack
을 import
하여 사용할 수 있다.
일반적인 동작은 두가지가 있는데,
import java.util.Stack;
class Main{
public static void main(String[] args){
Stack<Integer> intStack = new Stack<>(); // Integer형 스택
Stack<String> stringStack = new Stack<>(); // String형 스택
Stack<Boolean> booleanStack = new Stack<>(); // Boolean형 스택
}
}
Stack<T> 스택 이름 = new Stack<>();
형태로 선언할 수 있으며, 데이터 타입은 클래스 또는 래퍼 클래스로 선언할 수 있다.ex) Stack<School> exStack = new Stack<>();
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack); // [1, 2, 3]
EmptyStackException
발생System.out.println(stack.pop()); // 3
System.out.println(stack); // [1, 2]
System.out.println(stack.pop()); // 2
System.out.println(stack.pop()); // 1
System.out.println(stack); // []
pop()
과 달리 Stack에서 객체를 꺼내지는 않는다EmptyStackException
발생stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.peek()); // 3
pop
이나 peek
을 하게 되면 EmptyStackException
예외가 발생하게 된다. 따라서 항상 메서드 호출 시에 스택에 데이터가 존재하는지 확인해야 한다.Stack<Integer> stack = new Stack<>();
stack.push(1);
// 스택이 비어있지 않다면 안전하게 요소를 제거
if(!stack.isEmpty() {
stack.pop();
}
Stack 클래스는 Vector 클래스를 상속했으며, Vector 클래스는 List 인터페이스를 구현하므로 size() 메서드를 사용할 수 있다.
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.size()); // 3
스택&힙
은 몰라서는 안되는, 기초중의 기초지식이다.