먼저 Stack에대해 간단히 설명하자면 아래와 같고 코드로 직접 구현해봤다.
스택
후입선출(LIFO / Last-In-First-Out): 최근 추가된 요소가 먼저 제거되고 먼저 추가된 요소가 나중에 제거된다. 이해하기 쉬운 예시로 식당에 줄을 서있는데 늦게 온 사람이 먼저 들어가는 것 이라고 생각하면 된다.
push : 스택에 data 넣음.
pop : 스택 맨 위의 data 제거. -> 가장 마지막에 push 한 data가 가장 먼저 pop 된다.
peek : pop과 유사하게 맨 위의 data 반환 -> 스택에서 제거되지 않음.
top : 가장 마지막에 추가된 data의 위치 (가장 맨위)
오버플로우 (Overflow)
자료가 스택 크기를 넘어 더 이상 push가 안될 때
언더플로우 (Underflow)
스택에 자료가 없어 더 이상 pop하지 못할 때 발생
public class Stack<E> { // 모든 타입의 데이터 취급
private int top; // 인덱스 위치
private int size; // Stack 크기
private ArrayList<E> list; // Stack에 담길 데이터 목록
public Stack(int size) { // Stack 객체를 생성하며 크기를 입력받을 때 초기화
this.top = -1;
this.size = size;
this.list = new ArrayList<>(size);
}
public void push(E e) {
if(isFUll()) {
throw new RuntimeException("가득");
}
top++; // 첫 인덱스는 -1이기에 0번째 인덱스에 값을 저장하기위해 +1
list.add(e); // Stack에 값 저장
}
public E pop() {
if(isEmpty()) {
throw new RuntimeException("비었음");
}
E e = list.get(top); // pop하기위해 마지막 값 변수 설정
list.remove(e); // 위에서 설정한 변수e 삭제
top--; // 삭제 이후 인덱스는 -1
return e; // 위에서 삭제할 데이터e 반환
}
public E peek() {
return list.get(top); // Stack의 마지막 값 반환
}
// Overflow 방지
public boolean isFUll() {
return size == list.size() - 1;
}
// Underflow 방지
public boolean isEmpty() {
return size < 0;
}
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>(4);
System.out.println("stack = " + stack.list); // stack = []
stack.push(1); // Stack에 1 저장
System.out.println("stack = " + stack.list); // stack = [1]
System.out.println(stack.pop()); // 저장된 1 삭제
System.out.println("stack = " + stack.list); // stack = []
for(int i=0; i< stack.size; i++) { // 0부터 3까지 4개의 데이터 저장
stack.push(i);
System.out.println("list stack = " + stack.list);
}
System.out.println("result stack = " + stack.list); // result stack = [0, 1, 2, 3]
System.out.println(stack.peek()); // 마지막 데이터 3 반환
stack.pop();// 마지막 데이터 3 삭제
System.out.println(stack.peek()); // 3 삭제 이후 마지막 데이터 2 반환
}
} // class Stack
'Java' 카테고리의 다른 글
[Java] LinkedList 구현 및 Array와 차이점 (0) | 2023.09.20 |
---|---|
[Java - Hash] HashTable / HashCollision(해시 충돌) (0) | 2023.09.04 |
[Java] REST API 간단 이해 (0) | 2023.08.04 |
[Java] DTO DAO 한번에 이해하기 (0) | 2023.07.30 |
[Java] 문자열 String, Buffer, Builder (0) | 2023.07.23 |