스택(Stack)이란?
- "쌓다", "쌓아 올리다"라는 뜻의 용어로, 데이터를 저장하고 관리하는 선형 자료 구조이다.
- LIFO(Last In, First Out) 형태로 마지막에 들어간 데이터가 가장 먼저 나오는 특성을 가지고 있다.
- 예시로 접시나 상자 쌓기와 유사한 형태라고 생각하면 된다.
스택의 주요 특징은?
- LIFO(Last In, First Out)
- 가장 마지막에 추가된 데이터가 가장 먼저 제거된다.
- 한쪽 끝에서만 작업 수행
- 데이터 삽입, 삭제가 스택의 맨 위(top)에서 이루어진다.
스택의 주요 연산은?
1. push or add
- 스택에 데이터를 추가한다.
Stack<Integer> stack = new Stack<>();
stack.push(10); // 스택에 10 추가
stack.add(20); // 스택에 20 추가
System.out.println("Stack: " + stack); // [10, 20]
Stack: [10, 20]
2. pop, clear
- 스택의 맨 위 데이터를 제거하고 반환한다.
- celar는 모든 값을 제거한다.
Stack<Integer> stack = new Stack<>();
stack.push(10);
stack.push(20);
int removedElement = stack.pop(); // 20 제거
System.out.println("삭제할 값: " + removedElement); // 20
System.out.println("그 후 배열: " + stack); // [10]
stack.clear(); // 값 없음
삭제할 값: 20
그 후 배열: [10]
3. peek
- 스택의 맨 위 데이터를 제거하지 않고 확인한다
tack<Integer> stack = new Stack<>();
stack.push(10);
stack.push(20);
int topElement = stack.peek(); // 맨 위 데이터 확인
System.out.println("맨 위 값: " + topElement); // 20
System.out.println("스택 배열: " + stack); // [10, 20]
맨 위 값: 20
스택 배열: [10, 20]
4. isEmpty
- 스택이 비어 있는지 확인하는 코드이다.
Stack<Integer> stack = new Stack<>();
System.out.println("해당 배열의 여부는? " + stack.isEmpty()); // true
stack.push(10);
System.out.println("해당 배열의 여부는? " + stack.isEmpty()); // false
해당 배열의 여부는? true
해당 배열의 여부는? false
5. size
- 스택에 저장된 데이터의 개수를 반환하는 코드이다.
Stack<Integer> stack = new Stack<>();
stack.push(10);
stack.push(20);
stack.push(30);
System.out.println("스택 사이즈: " + stack.size()); // 3
스택 사이즈: 3
마무리하며..
- 스택을 잘 활용할 수 있는 백준 문제 [28278 - 스택2]를 풀며 글을 마치겠다.
[최종 코드]
import java.io.*;
import java.util.*;
/*
1 X: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000) -> push
2: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다. -> pop
3: 스택에 들어있는 정수의 개수를 출력한다. -> size
4: 스택이 비어있으면 1, 아니면 0을 출력한다. -> isempty
5: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다. -> peek
for 문 사용, switch문 사용
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Stack<Integer> s = new Stack<>();
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
switch(Integer.parseInt(st.nextToken())) {
case 1:
s.push(Integer.parseInt(st.nextToken()));
break;
case 2:
if (!s.empty())
System.out.println(s.pop());
else
System.out.println(-1);
break;
case 3:
System.out.println(s.size());
break;
case 4:
if (s.empty())
System.out.println(1);
else
System.out.println(0);
break;
case 5:
if (!s.empty())
System.out.println(s.peek());
else
System.out.println(-1);
break;
default:
break;
}
}
}
}