본문 바로가기

Basic/자료구조,알고리즘

Queue의 다양한 구현

반응형

1. 원형 큐(링 버퍼) - 배열 기반


-  front(머리), rear(꼬리)라는 변수를 인덱스로 활용해 삽입,조회,삭제를 구현하였다.

-  front와 rear의 변수가 같다면 큐가 비어있는것이다.

-  front와 rear+1 이 같다면 큐가 꽉차있는것이다.

-  배열의 끝에 도달하면 첫번째 인덱스로 순환하여 원형큐라 한다.

-  삭제의 경우 배열에서 실제로 하지 않고 front(머리-출구), rear(꼬리-입구)의 값을 조정한다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package queue;
public class ArrayQueueMain {
    public static void main(String[] args) {//배열 기반 큐
        ArrayQueue queue = new ArrayQueue();
        
        System.out.println("=offer=");
        
        queue.offer("0");
        queue.offer("1");
        queue.offer("2");
        
        System.out.println("=peek=");
        
        System.out.println(queue.peek());
        
        System.out.println("=poll=");
        
        while(!queue.isEmpty()) {
            System.out.println(queue.poll());
        }
    }
}

cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package queue;
public class ArrayQueue {//배열 기반 큐
 
        int front=0;//출구 0으로 초기화
        int rear=0;//입구 0으로 초기화
        int QUE_LEN=4;//배열 크기
        
        Object[] queArr = new Object[QUE_LEN];
        
    public boolean offer(Object data) {//추가
        if(NextIdx(rear) == front)//입구와 출구의 인덱스가 하나 차이라면
        {
            System.out.println("큐가 꽉찾습니다.");
            return false;
        }
        rear = NextIdx(rear);
        queArr[rear] = data;
        return true;
    }
    
    public Object poll() {//삭제+반환
        if(isEmpty())
        {
            System.out.println("큐가 비어있습니다.");
            return null;
        }
        front = NextIdx(front);
        return queArr[front];
    }
    
    public Object peek() {//반환
        if(isEmpty())
        {
            System.out.println("큐가 비어있습니다.");
            return null;
            //System.exit(0);//시스템종료
        }
        return queArr[NextIdx(front)];    
    }
    
    public int NextIdx(int Idx)
    {
        if(Idx == QUE_LEN-1)//배열크기-1
            return 0;//배열의 첫번째 인덱스
        else
            return Idx+1;
    }
    public boolean isEmpty() {
        return front == rear;//인덱스의 위치가 같다면 큐가 비어있는것이다.
    }
}

cs



2. LinkedList 기반 큐의 직접 구현 ( Node 객체 ) 


LinkedList 를 안다면 쉽게 구현할 수 있다. head가 출구이고 tail이 입구이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package queue;
 
public class LinkedListQueue {
    private Node head;
    private Node tail;
    private int size = 0;
    
    public class Node{
        private Object data;
        private Node next;
        
        public Node(Object input) {
            this.data = input;
            this.next = null;
        }
    }
    public boolean offer(Object input){
        
        Node newNode = new Node(input);
        
        if(isEmpty()){
            head=newNode;
            tail=newNode;
        }else {
             tail.next = newNode;
             tail = newNode;
        }
        size++;
        return true;
    }
    
    public Object peek() {
        if(isEmpty()){
            return null;
        }else
            return head.data;
        }
    
    public Object poll(){
        if(!isEmpty()){
               Node temp = head;
               head = temp.next;
               
               Object returnData = temp.data;
               
               temp = null;
               
               size--;
               
               return returnData;
        }else{
            return null;
        }
       }
    
    public boolean isEmpty() {
        return size() == 0;
        }
    
    public int size(){
        return size;
    }
  }    

cs


3. 자바 라이브러리


-Queue 인터페이스를 구현한 LinkedList 클래스 활용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package queue;
import java.util.LinkedList;
public class LinkedListStackApi {
    public static void main(String[] args) {
        LinkedList<String> queue = new LinkedList();
        //큐 인터페이스를 구현한 LinkedList
        queue.offer("0");
        queue.offer("1");
        queue.offer("2");
        
        System.out.println("= java queue api peek=");
        
        System.out.println(queue.peek());//마지막 값 리턴
        
        System.out.println("= java queue api poll=");
        
        while(!queue.isEmpty()) {
            System.out.println(queue.poll());
        }
        
    }
}

cs


반응형

'Basic > 자료구조,알고리즘' 카테고리의 다른 글

트리  (0) 2019.01.09
Deque의 개념과 구현  (0) 2019.01.09
Queue - 큐의 개념과 특성들  (0) 2018.12.08
Stack의 다양한 구현  (0) 2018.12.07
Stack 스택의 개념과 특성들  (0) 2018.12.06