프로그래머스 사이트에서 문제를 풀다가 Java의 Stack에 대해 알게 되었다.
Stack에 대한 기본 설명과 활용 예제를 기록하기 위해 포스트를 작성하려 한다.
스택(Stack)
자료 구조 중 하나로, 데이터를 일렬로 나열한 구조로, 데이터를 저장하거나 꺼낼 때에는 가장 최근에 저장한 데이터부터 차례로 처리한다.
이를 "Last In, First Out (LIFO)"라고 부르는데 Java에서는 java.util.Stack 클래스나 java.util.Deque 인터페이스를 사용하여 스택을 구현할 수 있다.
스택의 주요 메서드
1. push(E item) : 스택에 요소를 추가한다. 가장 최근에 추가한 요소가 스택의 맨 위에 위치함
예시
import java.util.Stack;
public class StackTest {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack);
}
}
출력 결과
2. pop() : 스택에서 가장 최근에 추가한 요소를 꺼낸다. 스택에서 해당 요소는 제거됨
예시
import java.util.Stack;
public class StackTest {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
int top = stack.pop();
System.out.println(top); // 3
System.out.println(stack); // [1, 2]
}
}
출력 결과
3. peek() : 스택에서 가장 최근에 추가한 요소를 반환한다. 스택에서 해당 요소는 제거되지 않음
예시
import java.util.Stack;
public class StackTest {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
int top = stack.peek();
System.out.println(top); // 3
System.out.println(stack); // [1, 2, 3]
}
}
출력 결과
4. empty() : 스택이 비어있는지 확인한다. 비어있으면 true를 반환하고, 그렇지 않으면 false를 반환함
예시
import java.util.Stack;
public class StackTest {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
System.out.println(stack.empty()); // true
stack.push(1);
System.out.println(stack.empty()); // false
}
}
출력 결과
5. search(Object o) : 스택에서 특정 요소가 몇 번째 위치에 있는지 확인한다. 가장 최근에 추가한 요소를 1번째로 하여 위치를 반환함
예시
import java.util.Stack;
public class StackTest {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
int position = stack.search(3); // 3이 스택의 가장 위(최근)에 위치하므로 1 반환
System.out.println(position);
position = stack.search(4); // 4가 스택에 없으므로 -1 반환
System.out.println(position);
}
}
출력 결과
활용 문제
stack을 활용한 문제를 하나 풀어보고 싶어서 chatGPT를 활용해서 문제를 생성했다.
Q . 문제: 괄호 검사 (Square Bracket Matching)
주어진 문자열에서 [ 와 ] 괄호가 올바르게 열리고 닫히는지 확인하는 Java 프로그램을 작성하세요.
문자열은 [ 와 ] 괄호만 포함할 수 있으며, 괄호가 올바르게 매칭되면 "올바른 괄호"를 출력하고,
그렇지 않으면 "올바르지 않은 괄호"를 출력하세요.
예를 들어, 다음과 같은 입력 문자열을 고려해보세요:
입력: "[[[]]]"
결과: "올바른 괄호"
입력: "[[]["
결과: "올바르지 않은 괄호"
A. 풀이
더보기
import java.util.Stack;
public class StackTest {
public static boolean Question(String s) {
Stack<Character> stack = new Stack<>(); //스택 생성
for (char bracket : s.toCharArray()) {
if (bracket == '[') {
stack.push(bracket);
} else if (bracket == ']' && !stack.isEmpty() && stack.peek() == '[') {
stack.pop();
} else {
return false; // `[`와 `]` 이외의 문자가 포함되어있거나 괄호가 매칭되지 않음
}
}
return stack.isEmpty(); // 스택이 비어있으면 모든 괄호가 매칭됨
}
public static void main(String[] args) {
String input1 = "[[[]]]";
String input2 = "[[][";
if (Question(input1)) {
System.out.println("올바른 괄호");
} else {
System.out.println("올바르지 않은 괄호");
}
if (Question(input2)) {
System.out.println("올바른 괄호");
} else {
System.out.println("올바르지 않은 괄호");
}
}
}
이렇게 Java의 Stack이 무엇이고, 어떻게 사용하는지 활용 문제까지 풀어보며 자세히 알아보았다.
Stack는 재귀 함수, 웹 브라우저 기록, 디버깅 등에 다양하게 활용되어 쓰인다고 하는데 아직 Stack 활용법에 익숙치 않아 감이 잘 안 잡힌다. 언젠가는 요긴하게 쓰일 일이 있지 않을까싶다 ~~
이미지 출처 : https://coding-factory.tistory.com/601
댓글