Stack<Integer> stack =newStack<>();stack.push(1); // 스택에 1 추가stack.push(2); // 스택에 2 추가System.out.println(stack.peek()); // 스택의 최상단 요소 반환 (2)stack.pop(); // 스택에서 최상단 요소 제거 (2 제거)System.out.println(stack.isEmpty()); // 스택이 비었는지 확인 (false)
문자열 괄호 유효성 검사 (스택 활용):
publicbooleanisValid(String s) {Stack<Character> stack =newStack<>();for (char c :s.toCharArray()) {if (c =='('|| c =='{'|| c =='[') {stack.push(c); } else {if (stack.isEmpty()) returnfalse;char top =stack.pop();if ((c ==')'&& top !='(') || (c =='}'&& top !='{') || (c ==']'&& top !='[')) {returnfalse; } } }returnstack.isEmpty();}
🛩️ Queue (큐)
큐 선언 및 사용 (add, remove, peek):
Queue<Integer> queue =newLinkedList<>();queue.add(1); // 큐에 1 추가queue.add(2); // 큐에 2 추가System.out.println(queue.peek()); // 큐의 첫 번째 요소 반환 (1)queue.remove(); // 큐에서 첫 번째 요소 제거 (1 제거)System.out.println(queue.isEmpty()); // 큐가 비었는지 확인 (false)
덱 선언 및 사용 (addFirst, addLast, removeFirst, removeLast, peekFirst, peekLast):
Deque<Integer> deque =newLinkedList<>();deque.addFirst(1); // 덱의 앞쪽에 1 추가deque.addLast(2); // 덱의 뒤쪽에 2 추가System.out.println(deque.peekFirst()); // 덱의 첫 번째 요소 확인 (1)System.out.println(deque.peekLast()); // 덱의 마지막 요소 확인 (2)deque.removeFirst(); // 덱의 첫 번째 요소 제거 (1 제거)deque.removeLast(); // 덱의 마지막 요소 제거 (2 제거)System.out.println(deque.isEmpty()); // 덱이 비었는지 확인 (true)
슬라이딩 윈도우 최대값 문제 (덱 활용):
publicint[] maxSlidingWindow(int[] nums,int k) {Deque<Integer> deque =newLinkedList<>();int[] result =newint[nums.length- k +1];int idx =0;for (int i =0; i <nums.length; i++) {// 윈도우 범위를 벗어난 값 제거if (!deque.isEmpty() &&deque.peekFirst() < i - k +1) {deque.pollFirst(); }// 덱 내에서 현재 값보다 작은 값 제거while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {deque.pollLast(); }deque.offerLast(i); // 현재 인덱스를 덱에 추가// 윈도우가 k 크기에 도달하면 결과 배열에 최대값 추가if (i >= k -1) { result[idx++] = nums[deque.peekFirst()]; } }return result;}
🛩️ PriorityQueue (우선순위 큐)
우선순위 큐 선언 및 사용 (add, poll, peek):
PriorityQueue<Integer> pq =newPriorityQueue<>(); // 기본적으로 최소 힙pq.add(3);pq.add(1);pq.add(2);System.out.println(pq.peek()); // 우선순위가 가장 높은 요소 반환 (1)pq.poll(); // 우선순위가 가장 높은 요소 제거 (1 제거)System.out.println(pq.peek()); // 이제 가장 높은 우선순위 요소는 2
최대 힙을 사용한 우선순위 큐 선언:
PriorityQueue<Integer> maxHeap =newPriorityQueue<>(Collections.reverseOrder());maxHeap.add(3);maxHeap.add(1);maxHeap.add(2);System.out.println(maxHeap.peek()); // 가장 큰 값 반환 (3)