스택, 큐 및 힙의 Java 구현

하나, 스택

특징 : 선입 선출 (FILO).
코드 구현 : Java는 공식적으로 Deque (양방향 대기열) 인터페이스를 사용하여 스택을 구현할 것을 권장합니다. 효율성을 낮추기 위해 Stack 클래스 (Vector 클래스 하위 클래스)를 사용하지 마십시오.
여기에 사진 설명 삽입
Deque에는 일반적으로 사용되는 두 가지 구현 클래스, 즉 ArrayDeque (하단 배열) 및 LinkedList (하단 연결 목록)가 있습니다.
이 두 가지 중에서 선택하는 방법은? 둘 다 장단점이 있다고 생각합니다.

  • LinkedList는 요소가 삽입되거나 삭제 될 때마다 Node를 생성하고 소멸시키는 작업으로 효율성이 낮고 LinkedList의 저장 구조가 연속적이지 않아 접근이 CPU 캐시를 잘 활용하지 못합니다. null을 삽입 할 수 있습니다.
  • ArrayDeque는 맨 아래 레이어가 배열이기 때문에 요소를 삽입하거나 삭제할 때 더 효율적입니다. 그러나 데이터가 완전히 조립되면 다시 복사해야합니다. null을 삽입 할 수 없습니다.
    ArrayDeque 소개
    ArrayDeque를 사용하는 것이 좋습니다. 스택의 크기를 알고있는 경우 생성 할 때 크기를 전달하는 것이 가장 좋습니다. 기본 크기 (매개 변수를 전달하지 않음)는 16이고 최소값은 8이며 다른 값이 전달됩니다. 크기는 2보다 n 제곱 한 값이고 최대 값은 2 30 2 ^ {30입니다. }23 0 .
public void testStack() {
    
    
        Deque<Integer> stack = new ArrayDeque<>();

        //入栈
        stack.push(1);
        stack.push(2);

        //返回栈顶元素,但不出栈
        Integer a1 = stack.peek();
        System.out.println(a1);//2

        //出栈
        Integer a2 = stack.pop();
        System.out.println(a2);//2
        Integer a3 = stack.pop();
        System.out.println(a3);//1
        
    }

둘째, 대기열

특징 : 선입 선출 (FIFO)

코드 구현 : Queue 인터페이스를 사용하거나 Deque 인터페이스를 사용합니다. Deque 상속 대기열. 위와 같이 구현 클래스가 선택됩니다.

public void test1() {
    
    
        Queue<Integer> queue = new ArrayDeque<>();

        //入队
        queue.offer(1);
        queue.offer(2);

        //出队
        Integer a1 = queue.poll();
        System.out.println(a1);//1

        //查看队首元素,但不出队
        Integer a2 = queue.peek();
        System.out.println(a2);//2
    }

3. 힙

풍모:

  1. 힙에서 리프가 아닌 노드의 값은 하위 노드의 값보다 작거나 (큰 상단 힙) 크지 않습니다 (작은 상단 힙).
  2. 힙은 항상 완전한 이진 트리입니다.
    요약하면, 큰 가기 더미 충족 heap[i]>=heap[2*i+1]heap[i]>=heap[2(i+1)]작은 위로 더미 heap[i]<=heap[2*i+1]heap[i]<=heap[2(i+1)]

완전한 이진 트리 : 이진 트리의 깊이가 k이면 k 번째 레이어를 제외한 각 레이어의 노드 수가 최대 개수에 도달하고 k 번째 레이어의 모든 노드가 가장 왼쪽에 연속적으로 집중되어 있습니다. 완전한 이진 트리. 아래 그림과 같이:

여기에 사진 설명 삽입
코드 구현 : PriorityQueue 클래스를 사용하여 구현하고 저장된 요소는 자연 정렬 (비교 가능) 또는 사용자 지정 정렬 (비교)이어야합니다. null 값을 저장할 수 없습니다. 기본값은 small top heap입니다. 맨 아래 레이어는 배열이고 기본 크기는 11입니다. 확장 : 배열 크기가 64보다 작 으면 가득 차면 두 번 확장되고, 그렇지 않으면 50 % 확장됩니다.

@Test
    public void test1() {
    
    
        //小顶堆
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        heap.addAll(Arrays.asList(6, 3, 8, 9, 1));
        System.out.println(heap);//[1, 3, 8, 9, 6]

        //入堆
        heap.offer(2);
        System.out.println(heap);//[1, 3, 2, 9, 6, 8]

        //出堆
        Integer poll = heap.poll();
        System.out.println(poll);//1

        //查看堆顶元素但不出堆
        Integer peek = heap.peek();
        System.out.println(peek);//2

        //大顶堆
        PriorityQueue<Integer> heap2 = new PriorityQueue<>((o1, o2) -> -Integer.compare(o1, o2));
        heap2.addAll(Arrays.asList(6, 3, 8, 9, 1));
        System.out.println(heap2);//[9, 8, 6, 3, 1]
    }

추천

출처blog.csdn.net/AmorFati1996/article/details/111869074