JAVA

LinkedList, Stack, Queue, Deque, PriorityQueue 사용법 정리

js1024 2024. 7. 4. 14:26

 

LinkedList

 

노드를 연결해 리스트처럼 사용하는 컬랙션

데이터의 삽입, 삭제에 빠른 성능을 보이지만 특정 요소에 접근하는 성능은 ArrayList에 비해 떨어진다. 뒤에서 사용할 stack, queue, dequeue, priorityQueue의 근간이 되는 컬랙션이다.

 

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) {
        LinkedList<Integer> link_list = new LinkedList<>();

        link_list.add(1); // 값 넣기
        link_list.add(2);
        link_list.add(3);
        link_list.add(4);

        for (Integer number : link_list) {
            System.out.println(number);
        }

        System.out.println("-----------");
        System.out.println(link_list.getFirst()); // 처음 값 반환
        System.out.println(link_list.getLast()); // 마지막 값 반환

        System.out.println("-----------");
        link_list.addFirst(5); // 첫번째에 값을 삽입
        link_list.addLast(0); // 마지막에 값을 삽입
        System.out.println(link_list.getFirst());
        System.out.println(link_list.getLast());

        System.out.println("-----------");
        link_list.remove(0); // n 값 제거
        System.out.println(link_list.getFirst()); 
        System.out.println(link_list.contains(0)); // n 값 유무 반환 true : false
        System.out.println(link_list.contains(5));

        System.out.println("-----------");
        Iterator it = link_list.iterator(); // 값이 존재하면 출력
        while(it.hasNext()) {
            Object num = it.next();
            System.out.println(num);
        }
        
    }
}

 

Stack

 

스택은 값을 쌓아 만드는 데이터 구조라고 할 수 있다. Last in First out 구조로 처음 들어온 값이 뒤로 점점 밀리고 데이터 추출 시 마지막에 들어온 데이터가 먼저 추출 된다.

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();

        stack.push(1); // n 값 삽입
        stack.push(2);
        stack.push(3);

        System.out.println(stack);

        System.out.println("---------");
        System.out.println(stack.pop()); // 값을 추출 후 제거
        
        System.out.println("---------");
        System.out.println(stack.peek()); // 값만 추출 제거 X
        
        System.out.println("---------");
        System.out.println(stack.isEmpty()); // 스택의 공백 여부 반환 true : false
        
        System.out.println("---------");
        System.out.println(stack.search(2)); // 값이 있는지 탐색 index : -1
        System.out.println(stack.search(0)); // 없는 값이므로 -1

        System.out.println("---------");
        System.out.println(stack.contains(2)); // 값이 있는지 탐색 true : false
             
    }
}

 

Queue

 

First in First out 선입선출 형태로 먼저 들어온 값이 먼저 출력되는 형태이다. 

 

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) {

        Queue<Integer> q = new LinkedList<>();

        q.add(1); // n 값 삽입 
        q.add(2);
        q.add(4);
        q.add(6);
        q.add(8);
        q.add(10);

        System.out.println(q);
        System.out.println(q.offer(12)); // n 값 삽입 
        
        System.out.println("-----------");
        System.out.println(q.poll()); // 값을 추출 후 제거
        
        System.out.println("-----------");
        System.out.println(q.peek()); // 값 추출 후 제거 X
        
        System.out.println("-----------");
        System.out.println(q);

        System.out.println("-----------");
        System.out.println(q.isEmpty()); // 값 유무 반환 true : false
        
        System.out.println("-----------");
        System.out.println(q.contains(2)); // 값 존재 여부 반환 true : false

        System.out.println("-----------");
        q.clear(); // 값 초기화 
        System.out.println(q);
        
    }
}

 

Deque

 

stack, queue가 동시에 사용할 수 있는 인터페이스이다. 말 그대로 양쪽으로 입출력이 가능하다.

 

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) {
        Deque<Integer> dq = new LinkedList<>();

        dq.addFirst(1); // stack push
        dq.addFirst(2);
        dq.addLast(3); // queue push
        dq.addLast(4);

        System.out.println(dq);
        
        System.out.println(dq.pollFirst()); // stack poll
        System.out.println(dq.pollLast()); // queue poll

        System.out.println(dq);

        System.out.println(dq.peekFirst()); // stack peek
        System.out.println(dq.peekLast()); // queue peek
        
    }
}

 

우선순위 큐 priorityQueue

 

위에서 사용한 queue와 다르게 값들의 우선 순위가 부여되며 해당 값을 기준으로 정렬된다. 기본적으로 오름차순으로 정렬되며 별도의 조건을 정의하기 위해서는 Comparable 인터페이스를 구현해 copare 메서드 로직을 작성해 우선순위를 변경할 수 있다.

 

import java.util.*;

class Main {
    public static void main(String[] args) {
        // Default
        PriorityQueue<Integer> pqAsc = new PriorityQueue<>();

        pqAsc.offer(1); // n 값 삽입
        pqAsc.offer(6);
        pqAsc.offer(8);
        pqAsc.offer(4);

        System.out.println("오름차순");
        while(!pqAsc.isEmpty()) {
            System.out.println("pqAsc = " + pqAsc.poll());
        }
		
        // 내림차순 정의하기 위한 compare
        PriorityQueue<Integer> pqDesc = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });

        pqDesc.offer(1);
        pqDesc.offer(6);
        pqDesc.offer(8);
        pqDesc.offer(4);

        System.out.println("\n내림차순");
        while(!pqDesc.isEmpty()) {
            System.out.println("pqDesc = " + pqDesc.poll());
        }
    }
}