Java Collection - Stack

Stack은 사전적으로는 ‘더미’를 의미한다. 이 개념을 처음 공부할때 데이터를 수직으로 관리하는 자료구조라고 생각하며 이해했다.

출처 : holycoders

Stack은 나중에 들어온 데이터가 먼저 나간다고 해서 LIFO(Last In First Out)의 형태를 띈다고 한다.

따라서 Stack은 배열과 다르게 첫번째로 삽입된 데이터의 인덱스가 0이 아니라 가장 마지막에 삽입된 데이터가 인덱스 0을 갖게된다.

Stack의 특징은 다음과 같다.

  • 먼저 들어간 데이터가 나중에 나간다. Last In First Out
  • 인터럽트 처리, 수식의 계산, 서브루틴의 복귀 번지 저장등에 쓰인다.
  • 그래프의 깊이 우선 탐색(DFS) 알고리즘에 사용됨
  • 재귀적(Recursion) 함수를 호출할 때 사용

아직은 Stack의 특징이 와닿지 않는다. 앞으로 자료구조 공부를 하면서 계속 채워넣어야겠다.

오라클 레퍼런스 문서를 통해 살펴보도록 하자.

Stack은 java.util에 있는 클래스이다.

Collection<E> 인터페이스와 Lis<E>의 구현체이면서, Vector 클래스를 상속받는 제네릭 클래스이다.

Stack은 제네릭 클래스이기 때문에 제네릭 타입으로 레퍼런스 타입(Integer, String, Object)을 지정할 수 있다.

Methods

Stack의 주요 메소드들이다.

  • empty() : Stack이 비어있는지 여부에 대해 boolean 값 반환
  • push(E item) : Stack에 데이터를 삽입하고, 삽입한 데이터를 반환하는 메소드
  • pop() : Stack의 최상위 데이터를 삭제하고, 삭제한 데이터를 반환하는 메소드
  • peek() : Stack의 최상위 데이터를 반환하는 메소드
  • search(Object o) : 파라미터로 들어온 데이터의 인덱스를 반환하는 메소드

empty()

1
public boolean empty()

Stack에 데이터가 empty 상태인지를 boolean 타입으로 반환해주는 메소드이다.

1
2
3
4
5
6
7
8
import java.util.Stack;

public class StackStudy {
public static void main(String[] args) {
Stack<Object> stack = new Stack<>();
System.out.println(stack.empty());
}
}

true

데이터를 추가하지 않아서 empty() 결과로 true를 반환받았다.


push()

1
public E push(E item)

Stack의 제네릭 타입으로 지정된 타입의 데이터를 삽입하고, 삽입한 데이터를 반환해주는 메소드이다.

1
2
3
4
5
6
7
8
9
10
11
import java.util.Stack;

public class StackStudy {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.toString());
}
}

[1, 2, 3]

삽입된 데이터를 toString()를 이용하여 콘솔에서 확인할 수 있었다.


pop()

1
public E pop()

Stack의 최상위 데이터, 즉 마지막에 삽입된 데이터를 삭제하고, 삭제한 데이터를 반환하는 메소드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.Stack;

public class StackStudy {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);

System.out.println(stack.toString());
System.out.println("삭제할 데이터 : "+stack.pop());
System.out.println(stack.toString());
}
}

[1, 2, 3]
삭제할 데이터 : 3
[1, 2]


peek()

1
public E peek()

Stack의 최상위 데이터 즉, 가장 마지막에 stack에 삽입되어 가장 먼저 나가게될 데이터를 반환해주는 메소드이다.

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Stack;

public class StackStudy {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);

System.out.println(stack.peek());
System.out.println(stack.toString())
}
}

2
[1, 2]

가장 마지막에 삽입한 데이터 2peek()의 결과로 반환된걸 확인했다.


1
public int search(Object o)

파라미터로 들어온 데이터를 Stack에서 찾아서 인덱스를 반환하는 메소드이다.

여기서 눈에띄는 점은 파라미터로 받은 데이터타입이 Stack<E> 클래스의 제네릭 타입 E가 아니라 그냥 Object라는 것이다.

search()는 모든 데이터 타입을 검색할 수 있으며, Stack에 없으면 -1을 반환한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Stack;

public class StackStudy {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);

System.out.println(stack.search(1));
System.out.println(stack.search("hello"));
}
}

3
-1

1 이라는 데이터가 stack에 있는지를 찾아서 인덱스로 3을 반환했다. Stack은 배열과 다르게 반대로 인덱싱되기 때문에 가장 먼저 삽입된 데이터 1이 마지막 인덱스 3을 갖게된 것이다.

제네릭 타입과도 맞지않는 stack에 없는 데이터에 대한 결과는 -1을 반환했다.



Reference