Skip to content

Latest commit

ย 

History

History
591 lines (454 loc) ยท 13.2 KB

File metadata and controls

591 lines (454 loc) ยท 13.2 KB

Stack and Queue

Stack
Queue
Deque
Q&A



Stack

Stack์ด๋ž€

Untitled

Stack ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจ๊ณก์ฐจ๊ณก ์Œ“์•„ ์˜ฌ๋ฆฐ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ Stack์˜ ํŠน์ง•

  • LIFO (Last In First Out; ํ›„์ž…์„ ์ถœ) : ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋œ ์ž๋ฃŒ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์‚ญ์ œ ๋œ๋‹ค
  • top ์€ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋“ค์–ด์˜จ ์ž๋ฃŒ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , top ์œผ๋กœ ์ง€์ •ํ•œ ๊ณณ์„ ํ†ตํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ(pop)ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€(push)ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž๋ฃŒ๊ตฌ์กฐ Stack์€ Array, LinkedList ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์šด์˜์ฒด์ œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ: Stack

์šด์˜์ฒด์ œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋Š” ์œ ์ € ์˜์—ญ, ์ปค๋„ ์˜์—ญ ์ด ์žˆ๋‹ค.
์œ ์ € ์˜์—ญ์€ ํฌ๊ฒŒ 4๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๋Š”๋ฐ ์ฝ”๋“œ ์˜์—ญ, ๋ฐ์ดํ„ฐ ์˜์—ญ, ํž™ ์˜์—ญ, ์Šคํƒ ์˜์—ญ ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
์Šคํƒ ์˜์—ญ์€ ์ง€์—ญ๋ณ€์ˆ˜ , ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ์ด๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ์Šคํƒ ์˜์—ญ์— ์Œ“์ด๊ณ , ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์Šคํƒ ์˜์—ญ์—์„œ pop๋œ๋‹ค.

stack overflow
ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ํฐ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฌดํ•œ์ • ํ˜ธ์ถœํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ์šด์˜์ฒด์ œ์˜ ์Šคํƒ ์˜์—ญ์˜ ๊ณต๊ฐ„์ด ๊ฐ€๋“์ฐจ๊ฒŒ ๋  ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•œ๋‹ค.
์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์—์„œ ์Šคํƒ ์˜์—ญ์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜, ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ฑฐ๋‚˜, ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๊พธ์–ด stack overflow ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

stack underflow
๋น„์–ด์žˆ๋Š” ์Šคํƒ์—์„œ ์›์†Œ๋ฅผ ์ถ”์ถœํ•˜๋ ค๊ณ  ํ•  ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•œ๋‹ค.
๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด, ๋น„์–ด์žˆ๋Š” ์Šคํƒ์— pop ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์ด๋‹ค.

Stack์˜ ํ™œ์šฉ ์˜ˆ์‹œ

Stack์€ ๋“ค์–ด์˜จ ์ˆœ์„œ์˜ ๋ฐ˜๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

  • ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ๋’ค๋กœ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ
  • ์‹คํ–‰ ์ทจ์†Œ (Undo) ๊ธฐ๋Šฅ
  • ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ• ๊ณ„์‚ฐ ๊ธฐ๋Šฅ
  • ์ˆ˜์‹์˜ ๊ด„ํ˜ธ ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ

Array๋กœ ๊ตฌํ˜„ํ•œ Stack

Details
import java.util.EmptyStackException;

public class StackArray {

    int top;
    int size;
    int[] stack;

    public StackArray(int size) {
        this.size = size;
        stack = new int[size];
        top = -1;
    }

    public void push(int item) {
        if (top >= size) {
            throw new StackOverflowError();
        }

        stack[top++] = item;
    }

    public int pop() {
        if (top == 0) {
            throw new EmptyStackException();
        }
        int data = stack[top];
        stack[top--] = 0;
        return data;
    }

    public int search(int target) {
        for (int i = 0; i < top; i++) {
            if (stack[i] == target) {
                return i;
            }
        }
        return -1;
    }
}

LinkedList๋กœ ๊ตฌํ˜„ํ•œ Stack

Details
import java.util.EmptyStackException;

public class StackLinked {
    public static void main(String[] args) {
        StackLinked stack = new StackLinked();
        for (int i = 0; i < 10; i++) {
            stack.push(i);
        }

        stack.display(); // 9-> 8-> 7-> 6-> 5-> 4-> 3-> 2-> 1-> 0->
        System.out.println(stack.pop()); // 9
        stack.display(); // 8-> 7-> 6-> 5-> 4-> 3-> 2-> 1-> 0->
    }

    private Node top;

    public StackLinked() {
        top = null;
    }

    public boolean isEmpty() {
        return top == null;
    }

    public void push(int item) {
        Node node = new Node(item);
        node.next = top; // ์—ฐ๊ฒฐ
        top = node; // top์€ Stack์˜ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
    }

    public int pop() {
        if (top == null) {
            throw new EmptyStackException();
        }

        Node node = top;
        top = top.next;
        return node.item;
    }

    public int search(int target) {
        int id = 0;
        Node temp = top;

        while (temp != null) {
            if (temp.item == target) {
                return id;
            }

            temp = temp.next;
            id++;
        }

        return -1;
    }

    public void display() {
        if (top == null) {
            throw new EmptyStackException();
        }

        Node temp = top;
        while (temp != null) {
            System.out.print(temp.item + "-> ");
            temp = temp.next;
        }
        System.out.println();
    }

    public class Node {
        private int item;
        private Node next;

        public Node(int item) {
            this.item = item;
            next = null;
        }
    }
}


Queue

Queue ๋ž€

Untitled

์„ ์ž…์„ ์ถœ (FIFO) ๋ฐฉ์‹์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

Queue์˜ ํŠน์ง•

  • FIFO (First In First Out; ์„ ์ž…์„ ์ถœ) : ๋จผ์ € ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ์‚ญ์ œ๋œ๋‹ค.
  • front ๋Š” ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์‚ญ์ œ์—ฐ์‚ฐ(dequeue)์ด ์ˆ˜ํ–‰๋œ๋‹ค
  • rear ๋Š” ๊ฐ€์žฅ ๋ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์‚ฝ์ž…์—ฐ์‚ฐ(enqueue)์ด ์ˆ˜ํ–‰๋œ๋‹ค.
  • Queue๋Š” Array, LinkedList ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Queue์˜ ํ™œ์šฉ ์˜ˆ์‹œ

Queue๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ์ƒํ™ฉ์— ์‚ฌ์šฉ๋œ๋‹ค.

  • ํ”„๋กœ์„ธ์Šค ์Šค์ผ€์ฅด๋ง
  • BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) ๊ตฌํ˜„
  • LRU ์บ์‹œ ๊ตฌํ˜„ (์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์‚ญ์ œํ•˜๋Š” ์บ์‹œ)

Array๋กœ ๊ตฌํ˜„ํ•œ Queue

Details
public class QueueArray {
    int front;
    int rear;
    int[] queue;

    public QueueArray(int size) {
        queue = new int[size];
        front = rear = 0;
    }

    public boolean isEmpty() {
        return front == rear;
    }

    public boolean isFull() {
        return rear == queue.length - 1;
    }

    public void enqueue(int item) {
        if (isFull()) {
            System.out.println("queue is full");
            return;
        }

        queue[rear++] = item;
    }

    public int dequeue() {
        if (isEmpty()) {
            System.out.println("queue is empty");
            return -1;
        }
        int data = queue[front];
        // ๋ชจ๋“  ์›์†Œ๋ฅผ ํ•œ์นธ ์•ž์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
        for (int i = 0; i < rear - 1; i++) {
            queue[i] = queue[i + 1];
        }
        if (rear < queue.length) {
            queue[rear] = 0;
        }
        rear--;

        return data;
    }

    public void display() {
        if (isFull()) {
            System.out.println("queue is empty");
            return;
        }

        for (int i = front; i < rear; i++) {
            System.out.print(queue[i] + " <- ");
        }
        System.out.println();
    }
}

LinkedList๋กœ ๊ตฌํ˜„ํ•œ Queue

Details
public class QueueLinked {

    public static void main(String[] args) {
        QueueLinked queue = new QueueLinked();
        for (int i = 0; i < 10; i++) {
            queue.enqueue(i);
        }
        queue.display(); // 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -
        for (int i = 0; i < 5; i++) {
            queue.dequeue();
        }
        queue.display(); // 5 - 6 - 7 - 8 - 9 -
    }

    Node front, rear;

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

    public boolean isEmpty() {
        return front == null && rear == null;
    }

    public void enqueue(int item) {
        Node node = new Node(item);
        if (isEmpty()) {
            front = rear = node;
        } else {
            rear.next = node;
            rear = node;
        }
    }

    public int dequeue() {
        if (isEmpty()) {
            System.out.println("queue is empty");
            return -1;
        }

        int data = front.item;
        front = front.next;

        if (front == null) {
            rear = null;
        }

        return data;
    }

    public void display() {
        if (isEmpty()) {
            System.out.println("queue is empty");
            return;
        }

        Node node = front;
        while (node != null) {
            System.out.print(node.item + " - ");
            node = node.next;
        }
        System.out.println();
    }

    public class Node {
        private int item;
        private Node next;

        public Node(int item) {
            this.item = item;
            next = null;
        }
    }
}

Stack์œผ๋กœ ๊ตฌํ˜„ํ•œ Queue

Details
import java.util.Stack;

public class QueueWithStack {

    private Stack<Integer> s1 = new Stack<>();
    private Stack<Integer> s2 = new Stack<>();

    public void enqueue(int item) {
        while (!s1.empty()) {
            s2.push(s1.pop());
        }

        s1.push(item);

        while (!s2.empty()) {
            s1.push(s2.pop());
        }
    }

    public int dequeue() {
        if (s1.empty()){
            System.out.println("queue is empty");
            return -1;
        }

        return s1.pop();
    }
}


Deque

Deque๋ž€

Untitled

Queue ๋‘ ๊ฐœ๋ฅผ ์ขŒ์šฐ๋กœ ๋’ค์ง‘์—์„œ ๋ถ™์ธ ๊ตฌ์กฐ์˜ ํ™•์žฅ๋œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
์–‘์ชฝ ๋์—์„œ ์‚ฝ์ž…, ์‚ญ์ œ ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™•์žฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

Deque์˜ ํŠน์ง•

  • ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ์–‘์ชฝ ๋์—์„œ ์ด๋ค„์ง„๋‹ค.
  • Doubly Ended Queue์˜ ์•ฝ์ž์ด๋‹ค.
  • Queue์™€ ๋™์ผํ•˜๊ฒŒ front , rear ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Queue์™€ Stack์˜ ์žฅ์ ๋งŒ ๋”ฐ์„œ ๊ตฌ์„ฑํ•œ ๊ฒƒ์ด๋‹ค.

scroll

Untitled

์ž…๋ ฅ์ด ํ•œ์ชฝ์—์„œ๋งŒ ์ด๋ค„์ง€๊ณ , ์ถœ๋ ฅ์€ ์–‘์ชฝ์—์„œ ๋ชจ๋‘ ์ด๋ค„์ง€๋Š” ์ž…๋ ฅ์ด ์ œํ•œ๋œ Deque

shelf

Untitled

์ž…๋ ฅ์€ ์–‘์ชฝ์—์„œ ๋ชจ๋‘ ์ด๋ค„์ง€๊ณ , ์ถœ๋ ฅ์ด ํ•œ์ชฝ์—์„œ๋งŒ ์ด๋ค„์ง€๋Š” ์ถœ๋ ฅ์ด ์ œํ•œ๋œ Deque

Array๋กœ ๊ตฌํ˜„ํ•œ Deque

Details
public class DequeWithArray {

    public static void main(String[] args) {
        DequeWithArray deque = new DequeWithArray(20);
        for (int i = 1; i <= 5; i++) {
            deque.insertFront(i);
        }
        deque.display(); // 5 4 3 2 1
        for (int i = 1; i <= 5; i++) {
            deque.insertRear(-i);
        }
        deque.display(); // 5 4 3 2 1 -1 -2 -3 -4 -5
    }

    private int arr[];
    private int front;
    private int rear;
    private int size;

    public DequeWithArray(int size) {
        arr = new int[100];
        front = -1;
        rear = 0;
        this.size = size;
    }

    public boolean isFull() {
        return ((front == 0 && rear == size - 1) || front == rear + 1);
    }

    public boolean isEmpty() {
        return front == -1;
    }

    public void insertFront(int item) {
        if (isFull()) {
            System.out.println("overflow");
            return;
        }

        if (front == -1) {
            front = rear = 0;
        } else if (front == 0) {
            front = size - 1;
        } else {
            front--;
        }

        arr[front] = item;
    }

    public void insertRear(int item) {
        if (isFull()) {
            System.out.println("overflow");
            return;
        }

        if (front == -1) {
            front = rear = 0;
        } else if (rear == size - 1) {
            rear = 0;
        } else {
            rear++;
        }

        arr[rear] = item;
    }

    public int deleteFront() {
        if (isEmpty()) {
            System.out.println("queue underflow");
            return -1;
        }
        int data = arr[front];
        if (front == rear) {
            front = rear = -1;
        } else if (front == size - 1) {
            front = 0;
        } else {
            front++;
        }

        return data;
    }

    public int deleteRear() {
        if (isEmpty()) {
            System.out.println("queue underflow");
            return -1;
        }

        int data = arr[rear];
        if (front == -1) {
            front = rear = -1;
        } else if (rear == 0) {
            rear = size - 1;
        } else {
            rear--;
        }
        return data;
    }

    public void display() {
        if (isEmpty()) {
            System.out.println("queue is empty");
            return;
        }

        if (front < rear) {
            for (int i = front; i <= rear; i++) {
                System.out.print(arr[i] + " ");
            }
            System.out.println();
        } else {
            for (int i = front; i < size; i++) {
                System.out.print(arr[i] + " ");
            }
            for (int i = 0; i <= rear; i++) {
                System.out.print(arr[i] + " ");
            }
            System.out.println();
        }
    }
}

์ฐธ๊ณ 

Stack and Queue

Stack Overflow

์šด์˜์ฒด์ œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

Stack Underflow, 2

Queue using Stacks

Deque

Deque using Array


๋ฉด์ ‘ ์˜ˆ์ƒ ์งˆ๋ฌธ

Stack, Queue, LinkedList์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์„ธ์š”
Stack์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์„ธ์š”
Stack Overflow์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”
Queue์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์„ธ์š”