■ Stack 이란
- 스택(stack)의 사전적 정의는 '쌓다', '더미'로서 데이터를 쌓는 자료 구조라고 할 수 있다
- 스택은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 구조 특징을 가지고 있는데 이러한 구조를 LIFO(Last In First Out) 구조라고 말한다
- 직전의 데이터를 빠르게 가져올 수 있는 장점이 있어 뒤로가기, 실행취소 , 컴퓨터 구조의 스택 메모리가 대표적이다
● Stack 사용법
메소드 | 설명 |
boolean empty() | Stack이 비어있는지 알려준다 |
push() | Stack에 객체를 저장한다 |
pop() | Stack의 맨 마지막에 저장된 객체를 빼낸다 비어있는 경우 EmptyStackException 발생 |
peek() | Stack의 맨 마지막에 저장된 객체를 반환 pop과 달리 삭제되지는 않는다 비어있는 경우 EmptyStackException 발생 |
search() | Stack에서 주어진 객체를 찾아서 그 위치를 반환 못 찾을경우 -1을 반환 |
- 요소 넣기 꺼내기
stack에 데이터를 추가하는 동작은 push() 메소드를 사용하며 요소를 추가하고, 데이터를 빼는 동작은 pop()를 사용한여 LIFO의 구조로 꺼내지게 된다
public class Main {
public static void main(String[] args) {
Stack<Number> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack); // [1, 2, 3]
stack.pop();
System.out.println(stack); // [1, 2]
stack.pop();
System.out.println(stack); // [1]
}
}
- Stack 최상단 요소 가져오기
stack에 들어있는 요소들 중 최상단 값을 확인만 하고 스택에서 삭제하고 싶지 않은 경우 peek() 메소드를 사용하면 데이터를 확인 할 수 있다
public class Main {
public static void main(String[] args) {
Stack<Number> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.peek()); // 3
System.out.println(stack); // 확인은 하되 제거 되지 않고 [1, 2, 3]이 나온다
}
}
- Stack 공간이 비어있는지 확인
public class Main {
public static void main(String[] args) {
Stack<Number> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.isEmpty()); // 비어 있다면 true 반환 그렇지 않다면 false
if(!stack.isEmpty()) {
stack.pop();
}
System.out.println(stack); // [1, 2]
}
}
- Stack 요소 위치 확인
Stack에 특정 데이터가 존재하는지 확인 하기위해 search() 메소드를 사용할 수 있다, 데이터가 존재하면 순서를 반환하고 존재하지 않는다면 -1을 반환한다. 주의할 점이 있다면 배열 인덱스처럼 0부터 시작하여 그 위치를 반환하는 것이 아니라 pop() 메소드를 호출했을때 몇번째로 나오는지에 대한 인덱스를 반환한다. 만일 반환값이 1이라면 가장 먼저 pop() 되는 요소라고 보면 된다
public class Main {
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
stack.push("김민재");
stack.push("손흥민");
stack.push("이강인");
stack.push("황희찬");
System.out.println(stack); // [김민재, 손흥민, 이강인, 황희찬]
System.out.println(stack.search("황희찬")); // 1
System.out.println(stack.search("손흥민")); // 3
}
}
Stack 클래스의 경우 ArrayList 처럼 동적 공간으로, 처음 Stack 생성 시 10개의 데이터를 저장할 수 있는 공간이 할당되고 push() 메소드를 통해 요소가 10개가 넘어가게 되면, 현재 Stack 사이즈의 2배에 해당하는 공간을 할당하고 기존 데이터를 복사한다.
■ Stack 활용해보기
public static void main(String[] args) {
/*
*문자열 중괄호를 입력 받아 문자 '{'의 각 갯수가 짝수이면 true
*그게 아니라면 false를 반환 (stack 사용)
* ex) {{}{}{{}}} -> true {{}}}{} -> false
*/
Scanner sc = new Scanner(System.in);
System.out.print("입력하세요 >> ");
String str = sc.next();
char[] ch = str.toCharArray();
Stack<Character> stack = new Stack<>();
for (char c : ch) {
if (c == ('{')) {
stack.push(c);
}else if(c == ('}')) {
stack.pop();
}else {
throw new EmptyStackException();
}
}
System.out.println(stack.isEmpty());
}
Today short review
자료구조 및 알고리즘 또한 공부하고 있는데 아직 시작한지 초반부이지만 기존의 알고 있는 부분보다 더 깊게 들어가는거 같아서 조금 어렵긴하다 그래도 배우면서 알아가는 과정이 시간도 잘가고 재밌는거 같다
'자료구조' 카테고리의 다른 글
LinkedList 구조 (0) | 2023.11.12 |
---|---|
ArrayList 구조 (0) | 2023.11.01 |