[Java] ์•Œ๊ณ ๋ฆฌ์ฆ˜_Queue

์ด๊ด‘ํ›ˆยท2023๋…„ 6์›” 19์ผ
0

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
2/4

โœ… ํ (Queue)

๐Ÿ‘‰ ๋จผ์ € ์ง‘์–ด ๋„ฃ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๋Š” ์„ ์ž…์„ ์ถœ(First in First out) ๊ตฌ์กฐ๋กœ ์ €์žฅํ•˜๋Š” ํ˜•์‹

๐Ÿ“ข ํŠน์ง•

  • ์ž๋ฃŒ๊ฐ€ ์ผ๋ ฌ๋กœ ๋†“์ธ ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ
  • ์ œ์ผ ๋จผ์ € ์ถ”๊ฐ€๋œ ์ž๋ฃŒ๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๋Š” ์„ ์ž…์„ ์ถœ ์ž๋ฃŒ๊ตฌ์กฐ

๐ŸŒ Queue์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ

  • Queue์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ โ†’ enQueue
  • Queue์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํšŒ์ˆ˜ โ†’ deQueue
  • Queue๊ฐ€ ๋น„์—ˆ๋Š”์ง€ ํ™•์ธ โ†’ isEmpty
  • Queue์˜ ์ œ์ผ ์•ž์— ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธ โ†’ peek()
  • Queue๊ฐ€ ๊ฐ€๋“ ์ฐจ์žˆ๋Š”์ง€ ํ™•์ธ (๊ณ ์ •๋œ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ)

๐ŸŒ ์„ ํ˜• Queue

๐Ÿšง ์˜ˆ์ œ ์ฝ”๋“œ

public class Main {
	private final int[] arr = new int[16];
    // Queue์—์„œ ๋ฐ์ดํ„ฐ ๊บผ๋‚ด๋Š” ์œ„์น˜
    private int front = -1;
    
    // Queue์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์œ„์น˜
    private int rear = -1;
    
    public Main() {}
    
    // ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
    public void enQueue(int x) {
    	// rear + 1 ์ด ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋งŒํ•ด์งˆ๋•Œ
        if(rear == arr.length -1) {
        	throw new RuntimeException("Queue is full");
        }
        // rear๋ฅผ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œํ‚ด
        rear++;
        // arr[rear] = x;
    }
    
    // ๋ฐ์ดํ„ฐ ํšŒ์ˆ˜
    public int deQueue() {
    	// front == rear ์ผ๋•Œ Queue๊ฐ€ ๋น„์–ด์žˆ์Œ
        if(front == rear) {
        	throw new RuntimeException("Queue is empty");
        }
        // front๋ฅผ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œํ‚ด
        front++;
        // arr[front]์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜
        return arr[front];
    }
    
    // ๋‹ค์Œ์— ๋‚˜์˜ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์ธ (Queue์—์„œ ๋นผ๋‚ด์ง€ ์•Š์Œ)
    public int peek() {
    	if(isEmpty()) {
        	throw new RuntimeException("Queue is empty");
        }
        // ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด front + 1์˜ ๊ฐ’ ๋ฐ˜ํ™˜
        return arr[front + 1];
    }
    
    public static void main(String[] args) {
    	Main intQueue = new Main();
        intQueue.enQueue(1);
        intQueue.enQueue(1);
        System.out.println(intQueue.deQueue());
        System.out.println(intQueue.deQueue());
    }
}

โ— ์„ ํ˜• Queue์˜ ๋ฌธ์ œ์ 

  • Stack์˜ top๊ณผ ๋‹ฌ๋ฆฌ ๋ฐฐ์—ด์„ ํ™œ์šฉํ•œ Queue์˜ rear๋Š” ์•ž์œผ๋กœ ์ด๋™ํ•˜์ง€ ๋ชปํ•˜๊ณ , ๊ณ„์†ํ•ด์„œ ๋’ค๋กœ๋งŒ ์ด๋™
  • ๋ฐฐ์—ด ๊ธฐ๋ฐ˜์˜ ์„ ํ˜• Queue๋Š” ๋ฌผ๋ฆฌ์  ๊ตฌ์กฐ์ƒ ๋ฐฐ์—ด์˜ ๋์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด ๋”์ด์ƒ enQueue ์ž‘์—… ๋ถˆ๊ฐ€๋Šฅ
  • deQueue๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐฐ์—ด์˜ ์•ž์ชฝ์—๋Š” ๋นˆ ๊ณต๊ฐ„์ด ํ™•๋ณด๋˜์ง€๋งŒ, Queue๊ฐ€ ๊ฐ€๋“ ์ฐจ์žˆ๋‹ค๊ณ  ์ธ์‹
  • ๋ฐ์ดํ„ฐ๋ฅผ ์•ž์ชฝ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๊ณต๊ฐ„์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋น„ํšจ์œจ์ ์ž„

๐ŸŒ ์›ํ˜• Queue

๐Ÿ‘‰ ์„ ํ˜• Queue์˜ ๋Œ€์•ˆ์œผ๋กœ front์™€ rear๊ฐ€ ๋ฐฐ์—ด์˜ ๋์— ๋„๋‹ฌํ•  ๊ฒฝ์šฐ ๋‹ค์‹œ ์ œ์ผ ์•ž์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ๊ตฌํ˜„

โš ๏ธย ํฌํ™” ์ƒํƒœ์™€ ๊ณต๋ฐฑ ์ƒํƒœ ๋น„๊ต๋ฅผ ์œ„ํ•ด front ์œ„์น˜๋ฅผ ๋น„์›Œ๋‘์–ด์•ผ ํ•˜๋ฏ€๋กœ ์‹ค์ œ ํฌ๊ธฐ๋ณด๋‹ค ๋ฐฐ์—ด์˜ ํฌ๊ธฐ + 1

โš ๏ธย ์ธ๋ฑ์Šค ํŒ๋‹จ ๊ธฐ์ค€๋„ + 1

๐Ÿšง ์˜ˆ์ œ ์ฝ”๋“œ

public class MyCyQueue {
	private final int size = 4;
    private final int offset = size + 1;
    private final int[] arr = new int[offset];
    private int front = 0;
    private int rear = 0;
    
    public myCyQueue() {}
    
    // ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
    public void enQueue(int x) {
    	// ๋‹ค์Œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ณณ: (rear + 1) % (size + 1)
        // ๋‹ค์Œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜์˜ฌ ๊ณณ๊ณผ ์ผ์น˜ ํ•  ๊ฒฝ์šฐ Full (์˜ˆ์™ธ)
        if ((rear + 1) % offset == front) {
        	throw new RuntimeException("Queue is full");
        }
        rear = (rear + 1) % offset;
        arr[rear] = x;
    }
    
    // ๋ฐ์ดํ„ฐ ํšŒ์ˆ˜
    public int deQueue() {
    	if (front == rear) {
        	throw new RuntimeException("Queue is empty");
        }
        front = (front + 1) % offset;
        return arr[front];
    }
    
    public boolean isEmpty() {
    	return front == rear;
    }
    
    public static void main(Stirng[] args) {
    	MyCyQueue queue = new MyCyQueue();
        queue.enQueue(1);
        queue.enQueue(2);
        queue.enQueue(3);
        queue.enQueue(4);
        queue.enQueue(5); // ์˜ˆ์™ธ ๋ฐœ์ƒ(queue is full)
        System.out.println(queue.deQueue());
        queue.enQueue(5);
        System.out.println(queue.deQueue());
        System.out.println(queue.deQueue());
        queue.enQueue(6);
        queue.enQueue(7);
        System.out.println(queue.deQueue());
        System.out.println(queue.deQueue());
        System.out.println(queue.deQueue());
        System.out.println(queue.deQueue());
    }
}

โœ… interface Queue <T>

๐Ÿ‘‰ Java Collection Framework์—์„œ ์ œ๊ณตํ•˜๋Š” interface Queue๋ฅผ ํ™œ์šฉํ•  ๋•Œ, ์ฃผ๋กœ LinkedList๋ฅผ ๊ตฌํ˜„์ฒด๋กœ ์‚ฌ์šฉ

๐ŸŒ Queue์˜ ๊ธฐ๋Šฅ

  • enQueue - Queue๊ฐ€ ๊ฐ€๋“ ์ฐจ์žˆ๋‹ค๋ฉด
    • add() โ†’ ์˜ˆ์™ธ ๋ฐœ์ƒ
    • offer() โ†’ false ๋ฐ˜ํ™˜
  • deQueue - Queue๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด
    • remove() โ†’ ์˜ˆ์™ธ ๋ฐœ์ƒ
    • poll() โ†’ null ๋ฐ˜ํ™˜
  • peek - Queue๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด
    • element() โ†’ ์˜ˆ์™ธ ๋ฐœ์ƒ
    • peek() โ†’ null ๋ฐ˜ํ™˜

๐Ÿšง ๊ตฌํ˜„

public class JavaQueue {
	public static void main(String[] args) {
    	Queue<Integer> queue = new LinkedList<>();
        
        // ensQueue
        // offer, add - enQueue์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์†Œ๋“œ
        queue.offer(1);
        queue.add(2);
        
        // deQueue
        // remove, poll - deQueue์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์†Œ๋“œ
        System.out.println(queue.remove());
        System.out.println(queue.poll());
        
        // peek
        // peek, element - peek์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์†Œ๋“œ
        System.out.println(queue.peek());
        System.out.println(queue.element());
    }
}
profile
์›ƒ์œผ๋ฉฐ ์ผํ•  ๋•Œ, ์‹œ๋„ˆ์ง€๊ฐ€ ๋ฐฐ๊ฐ€ ๋œ๋‹ค๊ณ  ๋ฏฟ๋Š” ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€