선형 자료구조의 일종으로 LIFO(Last In Last Out, 후입선출)
의 방식을 가지고 있다.
스택에 계속 데이터를 넣어야 할 때, 스택에 데이터를 저장할 수 있는 공간이 모두 차서 더이상 데이터를 넣을 수 없는 경우가 생긴다.
이런 경우에 2가지의 방법으로 해결할 수 있다.
1. 동적 배열 스택
push 함수를 수정하여 스택이 모두 찬 경우에 스택의 크기를 2배만큼 늘려주는 방법이다.
public void push(Object o) {
if(isFull(sp)) {
Object[] arr = new Object[MAX_SIZE * 2];
System.arraycopy(stack, 0, arr, 0, MAX_SIZE);
stack = arr;
MAX_SIZE *= 2; // 2배로 증가
}
stack[sp++] = o;
}
기존 스택의 2배 크기(MAX_SIZE * 2)의 임시 배열(arr)을 만들고 arraycopy
를 통해 임시 배열에 기존 스택의 데이터를 복사한다.
그 후 arr의 참조값(주소)를 stack에 덮어씌우고 MAX_SIZE를 2배로 증가시킨다.
이런 방법을 사용하게 된다면, 스택이 모두 찬 경우에 자동으로 스택의 크기를 늘릴 수 있다.
2. 연결 리스트(Linked List)
스택 자체를 연결리스트 형태로 만드는 것이다. 그럼 데이터의 크기 제한이 사라진다.
하지만 연결리스트는 단점이 존재하기에 단점을 잘 인지하고 사용해야 한다.
Stack과 마찬가지로 선형 자료구조의 일종이지만 FIFO(Last In Last Out, 선입선출)
의 방식을 가지고 있다.
front
, 가장 나중에 들어간 데이터를 rear
이라고 한다.rear
뒤에 넣고, 제거할 때에는 항상 front
가 가리키는 데이터를 제거한다.큐를 계속 삽입(enQueue)하다 보면 rear
== size - 1
이 되는 경우가 있다. 하지만 front
에서 삭제 연산을 하는 것 때문에 큐가 꽉 차있지 않은 경우가 있다. 이를 해결하기 위해 순차 큐
, 원형 큐
, 연결 리스트(Linked List)
방법을 사용할 수 있다.
rear
== size - 1
) 맨 앞으로 보내 다시 앞부터 데이터를 저장하여 원형으로 연결하는 방식이다.참고
한재엽님 Github Interview_Question_for_Beginner
gyoogle님 Github tech-interview-for-developer
https://devuna.tistory.com/22
https://velog.io/@gillog/큐Queue