성장일기

해당 포스터에서 큐에 대한 개념은 정리하지 않는다.

 

 하지만 코테준비를 위해 큐를 직접 구현한 코드(배열, 리스트)와 라이브러리를 활용 한 큐 자료구조 사용방법에 대해 정리하려고 한다.

 

 코테에서는 큐를 직접 구현하는 것보단 큐를 활용한 응용문제들이 많이 나오는 것 같다.

 

 

1. 배열을 이용한 구현


public class Queue_Array {
    int MAX = 1000;
    int front;    //머리 쪽에 위치할 index값, pop할때 참조하는 index
    int rear;    //꼬리 쪽에 위치할 index값, push할때 참조하는 index
    int [] queue;


    public Queue_Array() {
        front = rear = 0;    //초기값 0
        queue = new int[MAX]; //배열 생성
    }

    public boolean queueisEmpty() { //queue에 아무것도 들어있지 않은지 판단하는 함수
        return front == rear;
    }


    public boolean queueisFull() {    //queue가 가득 차 공간이 없는지 판단하는 함수
        if(rear == MAX-1) {
            return true;
        }else
            return false;
    }


    public int size() { //queue에 현재 들어가 있는 데이터의 개수를 return
        return front-rear;
    }


    public void push(int value) {
        if(queueisFull()) {
            System.out.println("Queue is Full");
            return;
        }
        queue[rear++] = value; //rear가 위치한 곳에 값을 넣어주고 rear를 증가시킨다.
    }


    public int pop() {
        if(queueisEmpty()) {
            System.out.println("Queue is Empty");
            return -1;
        }
        int popValue = queue[front++];
        return popValue;
    }


    public int peek() {
        if(queueisEmpty()) {
            System.out.println("Queue is Empty");
            return -1;
        }
        int popValue = queue[front];
        return popValue;
    }


}

 

 

 

2. 리스트를 이용한 구현


class QueueNode {
    int value; //값을 넣음
    QueueNode queueNode; //다음 노드를 가리킴

    public QueueNode(int value) {
        this.value = value;
        queueNode = null;
    }

    public int getValue() {
        return value;
    }

    public QueueNode getNextNode() {
        return queueNode;
    }

    public void setNextNode(QueueNode queueNode) {
        this.queueNode = queueNode;
    }
}

public class Queue_List{ //큐의 기능을 만들 클래스

    QueueNode front,rear;

    public Queue_List() {
        front = rear = null;
    }

    public boolean queueisEmpty() {
        if(front == null  && rear == null) {
            return true;
        }else {
            return false;
        }
    }

    public void push(int value) {
        QueueNode queueNode = new QueueNode(value);
        if(queueisEmpty()) {    //큐안에 데이터가 없으면 첫번째 Node에 front와 rear를 연결
            front = rear = queueNode;
        }else {
            front.setNextNode(queueNode); //큐 안에 데이터가 있으면 front를 다음 노드에 연결 후 front의 값을 마지막 노드로 삽입
            front = queueNode;
        }
    }

    public QueueNode pop() {
        if(queueisEmpty()) {
            System.out.println("Queue is Empty");
            return null;
        }else {
            QueueNode popNode = rear;
            rear = rear.getNextNode();
            return popNode;
        }
    }

    public QueueNode peek() {
        if(queueisEmpty()) {
            System.out.println("Queue is Empty");
            return null;
        }else {
            return rear;
        }
    }

    public int size() {
        QueueNode front2 = front;
        QueueNode rear2 = rear;
        int count = 0;
        while(front2 != rear2 && rear2 !=null) { //큐가 비어있는 경우가 있을수도 있을때도 생각해야함
            count++;
            rear2 = rear2.getNextNode();
        }
        return count;
    }

}

 

 

 

3. 라이브러리 사용


import java.util.LinkedList;
import java.util.Queue;

public class UseQueue {

    public static void main(String[] args) {

        Queue<Integer> queue = new LinkedList<>(); //int형 queue 선언, linkedlist 이용

        queue.add(1);     // queue에 값 1 추가
        queue.add(2);     // queue에 값 2 추가
        queue.offer(3);   // queue에 값 3 추가

        queue.peek();       // queue의 첫번째 값 참조
        queue.poll();       // queue에 첫번째 값을 반환하고 제거 비어있다면 null
        queue.remove();     // queue에 첫번째 값 제거

        queue.clear();      // queue 초기화
    }

}

 

공유하기

facebook twitter kakaoTalk kakaostory naver band