우리가 어떤 데이터를 저장했다가 사용하는 경우에 배열이나 리스트를 많이 사용한다. 그런데, 어떤 문제들은 배열과 리스트를 사용하는게 어렵고 심지어 정말 많은 시간이 걸리는 경우가 발생한다.
이런 경우, 배열을 좀 더 발전시킨 형태인 스택, 큐이라는 자료구조를 이용해 문제를 해결할 수 있게 된다. 오늘은 이 2가지 자료 구조에 대해 볼 것이다.
후입선출(LIFO : Last In First Out)이뤄지는 구조이다.
push(E item) : 스택에 데이터를 넣어줌 (가장 위에)
pop() : 가장 마지막에 들어온 값을 삭제하고 리턴
peek() : 가장 마지막에 들어온 값을 리턴
empty() : 스택에 데이터가 있다면 false 없다면 true 값을 리턴
search(Object o) : 해당 위치에 있는 데이터를 리턴한다.
⁉️ add와 push
Stack에는 push와 같은 기능을 하는 add라는 메소드도 존재한다. 그런데 Stack은 Vector을 상속받은 클래스 이기 때문에 Vector의 메소드는 push를 사용하는 것이 올바른 방법이다.
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Stack<Integer> myStack = new Stack<>();
myStack.push(1); // 1 넣기
myStack.push(2); // 2 넣기
myStack.push(3); // 3 넣기
myStack.pop(); // 3 삭제, 리턴
myStack.peek(); // 3 리턴
myStack.empty(); // 현재 1,2라는 값이 있으므로 false 리턴
myStack.search(1); // 2리턴
}
}
선입선출(FIFO : First In First Out)이뤄지는 구조이다.
add(e) : 큐가 꽉 차면 IllegalStateException 발생offer(e) : 삽입에 실패하면 false를 반환한다.remove() : 큐가 비면 NoSuchElementException 발생poll() : 큐가 비어있으면 null값을 리턴한다.peek() : 큐가 비면 NoSuchElementException 발생element() : 큐가 비어있으면 null값을 리턴한다. 각각의 삽입, 제거, 확인 메소드의 차이를 정리한 그림이다.
상황에 맞게 잘 사용하면 된다.

출처 : https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html
ArrayDeque(배열의 특징)와 LinkedList(List의 특징)가 있다.LinkedList를 통해 만든 Queue 예제이다.import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
Queue<Integer> q = new LinkedList<>();
q.add(1); // 값을 추가하기
q.add(2);
q.add(3);
q.peek(); // head에 있는 값을 확인 가능 : 1 리턴
q.poll(); // head에 있는 값을 확인, 삭제 : 1 리턴,삭제
}
}