[Java] Stack๊ณผ Queue

Jeiniยท2022๋…„ 12์›” 7์ผ
0

โ˜•๏ธย  Java

๋ชฉ๋ก ๋ณด๊ธฐ
40/59
post-thumbnail

๐Ÿ’กStack<E> ํด๋ž˜์Šค


โœ”๏ธ Stack ํด๋ž˜์Šค

  • List ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์˜ Vector ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„, ์ „ํ˜•์ ์ธ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์˜ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณต

์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋Š” ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด์„œ ํ›„์ž…์„ ์ถœ(LIFO)์˜ ์‹œ๋ฉ˜ํ‹ฑ์„ ๋”ฐ๋ฅด๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค.

์ฆ‰, ๊ฐ€์žฅ ๋‚˜์ค‘์— ์ €์žฅ๋œ(push) ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ธ์ถœ(pop)๋˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

Stack์„ ์ข€ ๋” ์•Œ์•„๋ณด์ž.

๐Ÿ“Ž Stack

โœ”๏ธ Stack
: LIFO(Last In First Out)๊ตฌ์กฐ. ๋งˆ์ง€๋ง‰์— ์ €์žฅ๋œ ๊ฒƒ์„ ์ œ์ผ ๋จผ์ € ๊บผ๋‚ด๊ฒŒ ๋œ๋‹ค.

์œ„์— ๊ทธ๋ฆผ์„ ๋ณด๋ฉด์„œ ์ƒ์ž๊ฐ€ ํ•˜๋‚˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

์—ฌ๊ธฐ์— 0์ด๋ผ๋Š” ๋ฌผ๊ฑด์„ ๋จผ์ € ๋„ฃ๊ณ  1์„ ๋„ฃ๊ณ  2์„ ๋„ฃ์—ˆ๋‹ค. ๋จผ์ € ๋„ฃ์€๊ฒŒ ๋ฐ”๋‹ฅ์— ๊น”๋ฆฌ๊ณ  ๊ทธ ๋‹ค์Œ ์ฐจ๊ณก์ฐจ๊ณก ์Œ“์—ฌ์งˆ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊บผ๋‚ผ๋•Œ๋Š” ๋งˆ์ง€๋ง‰์— ๋„ฃ์—ˆ๋˜ ๋ฌผ๊ฑด 2๋ถ€ํ„ฐ ๊บผ๋‚ด๊ฒŒ ๋œ๋‹ค.

โœ”๏ธ ์ €์žฅ(push)
: 0 โžก๏ธ 1 โžก๏ธ 2

โœ”๏ธ ์ถ”์ถœ(pop)
: 2 โžก๏ธ 1 โžก๏ธ 0

Stack๊ณผ Queue๋Š” ์ปดํ“จํ„ฐ์—์„œ ๊ฐ€์žฅ๋งŽ์ด ํ™œ์šฉ๋˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์ด๋‹ค.
์—ฌ๋Ÿฌ๊ณณ์—์„œ ํ™œ์šฉ๋„๊ฐ€ ์ ค ๋†’์€ ๊ฒƒ์ด Stack์ด๋‹ค.

๐Ÿ“Ž Stack์˜ ๋ฉ”์„œ๋“œ

โœ๏ธ boolean empty()

  • Stack์ด ๋น„์–ด์žˆ๋Š”์ง€ ์•Œ๋ ค์ค€๋‹ค.

โœ๏ธ Object peek()

  • Stack์˜ ๋งจ ์œ„์— ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (๋งจ ์œ„์— ๋ญ๊ฐ€ ์žˆ๋Š”์ง€ ๋ณด๋Š” ๊ฒƒ)
  • pop()๊ณผ ๋‹ฌ๋ฆฌ Stack์—์„œ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์ง€๋Š” ์•Š๋Š”๋‹ค.
  • ๋น„์—ˆ์„ ๋•Œ๋Š” EmptyStackException ๋ฐœ์ƒ

โœ๏ธ Object pop()

  • ์‚ญ์ œ
  • Stack์˜ ๋งจ ์œ„์— ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ธ๋‹ค.
  • ๋น„์—ˆ์„ ๋•Œ๋Š” EmptyStackException ๋ฐœ์ƒ

โœ๏ธ Object push(Object item)

  • ์ถ”๊ฐ€
  • Stack์— ๊ฐ์ฒด(item)๋ฅผ ์ €์žฅํ•œ๋‹ค.

โœ๏ธ int search(Object o)

  • Stack์—์„œ ์ฃผ์–ด์ง„ ๊ฐ์ฒด(o)๋ฅผ ์ฐพ์•„์„œ ๊ทธ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋ชป์ฐพ์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ์œ„์น˜๋Š” 0์ด ์•„๋‹Œ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

๐Ÿ’กQueue ์ธํ„ฐํŽ˜์ด์Šค


โœ”๏ธ Queue ์ธํ„ฐํŽ˜์ด์Šค

  • ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„๋œ ์Šคํƒ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ž๋ฐ”์—์„œ ํ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋ณ„๋„์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ˜•ํƒœ๋กœ ์ œ๊ณต๋œ๋‹ค.

์ด๋Ÿฌํ•œ Queue ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ํ•˜์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Deque<E>
  2. BlockingDeque<E>
  3. BlockingQueue<E>
  4. TransferQueue<E>

์ด ์ค‘์—์„œ Deque ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ LinkedList ํด๋ž˜์Šค๊ฐ€ ํ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

โœ”๏ธ Queue ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ class๋“ค

Queue๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ•  ์ˆ˜ ์—†๋‹ค.
๋”ฐ๋ผ์„œ Queue ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ class๋“ค์„ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ด์ค‘์— ์šฐ๋ฆฌ์—๊ฒŒ ์ต์ˆ™ํ•œ LinkedList ๊ฐ€ ์žˆ๋‹ค. ์ด class๋ฅผ ์จ์„œ Queue์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Queue q = new LickedList();
g.offer("0");

Queue์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

๐Ÿ“Ž Queue

โœ”๏ธ Queue
: FIFO(First In First Out)๊ตฌ์กฐ. ์ œ์ผ ๋จผ์ € ์ €์žฅํ•œ ๊ฒƒ์„ ์ œ์ผ ๋จผ์ € ๊บผ๋‚ด๊ฒŒ ๋œ๋‹ค.

์œ„์— ์‚ฌ์ง„์„ ๋ณด๋“ฏ์ด ์ด๊ฒƒ์€ ์ค„์„œ๊ธฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

๊ณ„์‚ฐ๋Œ€์— ์ค„์„ ์„ค๋•Œ ๋จผ์ € ์„  ์‚ฌ๋žŒ์ด ๋จผ์ € ํ•˜๋“ฏ์ด ์ด ๊ตฌ์กฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

์ €์žฅํ• ๋•Œ๋„ 0, 1, 2 ์ˆœ์œผ๋กœ ์ €์žฅํ–ˆ๋‹ค๋ฉด ๊บผ๋‚ผ๋•Œ๋„ 0, 1, 2 ์ˆœ์œผ๋กœ ๊บผ๋‚ด์ง„๋‹ค.

โœ”๏ธ ์ €์žฅ(offer)
: 0 โžก๏ธ 1 โžก๏ธ 2

โœ”๏ธ ์ถ”์ถœ(poll)
: 0 โžก๏ธ 1 โžก๏ธ 2

๐Ÿ“Ž Queue์˜ ๋ฉ”์„œ๋“œ

โœ๏ธ boolean add(object o)

  • ์ถ”๊ฐ€
  • ์ง€์ •๋œ ๊ฐ์ฒด๋ฅผ Queue์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ์„ฑ๊ณตํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ €์žฅ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜๋ฉด IllegalStateException ๋ฐœ์ƒ

โœ๏ธ Object remove()

  • ์‚ญ์ œ
  • Queue์—์„œ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋น„์–ด์žˆ์œผ๋ฉด NoSuchElementException ๋ฐœ์ƒ

โœ๏ธ Object element()

  • ์‚ญ์ œ์—†์ด ์š”์†Œ๋ฅผ ์ฝ์–ด์˜จ๋‹ค.
  • peek์™€ ๋‹ฌ๋ฆฌ Queue๊ฐ€ ๋น„์—ˆ์„ ๋•Œ NoSuchElementException ๋ฐœ์ƒ

โœ๏ธ boolean offer(Object o) โญ๏ธ

  • ์ถ”๊ฐ€
  • Queue์— ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ์„ฑ๊ณตํ•˜๋ฉด true, ์‹คํŒจํ•˜๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (์˜ˆ์™ธ๋ฐœ์ƒ X)

โœ๏ธ Object poll() โญ๏ธ

  • ์‚ญ์ œ
  • Queue์—์„œ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋น„์–ด์žˆ์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (์˜ˆ์™ธ๋ฐœ์ƒ X)

โœ๏ธ Object peek() โญ๏ธ

  • ์‚ญ์ œ์—†์ด ์š”์†Œ๋ฅผ ์ฝ์–ด์˜จ๋‹ค.
  • Queue๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ’ก Stack๊ณผ Queue ํ™œ์šฉ


โ“ ๋ฐฐ์—ด๊ณผ LinkedList์ค‘์— ๋ญ๊ฐ€ ๋” ์ ํ•ฉํ• ๊นŒ

โœ”๏ธ Stack: ๋ฐฐ์—ด

  • ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅ๋˜๊ณ  ์ถ”์ถœํ• ๋•Œ๋„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋’ค์—์„œ ๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ

โœ”๏ธ Queue: LinkedList

  • ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ฐฐ์—ด์„ ํ•ด๋„ ์ƒ๊ด€์—†๊ฒ ์ง€๋งŒ ๊บผ๋‚ผ๋•Œ๊ฐ€ ๋ฌธ์ œ์ด๋‹ค.
  • index[0]๋ถ€ํ„ฐ ๊บผ๋‚ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์„ ์“ฐ๊ฒŒ ๋œ๋‹ค๋ฉด ๋‚˜๋จธ์ง€ ๋’ค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค ์ด๋™์„ ํ•ด์•ผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ด๋‹ค.
  • ๋ฐ˜๋ฉด LinkedList๋Š” ์ž๋ฆฌ์ด๋™์ด ํ•„์š”์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œํ•  ๋•Œ ๋” ํšจ์œจ์ ์ด๋‹ค.

โœ๏ธ ์˜ˆ์‹œ

public class StackAndQueue {
    public static void main(String[] args) {
        Stack st = new Stack();
        Queue q = new LinkedList(); // Queue์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด์ธ LinkedList

        st.push("0");
        st.push("1");
        st.push("2");

        q.offer("0");
        q.offer("1");
        q.offer("2");

        System.out.println("==Stack==");
        while(!st.empty()) {
            System.out.println(st.pop()); // ์Šคํƒ์—์„œ ์š”์†Œ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๊บผ๋ƒ„
        }
        System.out.println("==Queue==");
        while(!q.isEmpty()) {
            System.out.println(q.poll()); // ํ์—์„œ ์š”์†Œ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๊บผ๋ƒ„
        }

    }
}
==Stack==
2
1
0
==Queue==
0
1
2

โœ”๏ธ Stack์˜ ํ™œ์šฉ ์˜ˆ

  • ์ˆ˜์‹๊ณ„์‚ฐ
  • ์ˆ˜์‹๊ด„ํ˜ธ๊ฒ€์‚ฌ
  • ์›Œ๋“œํ”„๋กœ์„ธ์„œ์˜ undo / redo
  • ์›น๋ธŒ๋ผ์šฐ์ €์˜ ๋’ค๋กœ / ์•ž์œผ๋กœ

โœ”๏ธ Queue์˜ ํ™œ์šฉ ์˜ˆ

  • ์ตœ๊ทผ ์‚ฌ์šฉ ๋ฌธ์„œ
  • ์ธ์‡„์ž‘์—… ๋Œ€๊ธฐ๋ชฉ๋ก
  • ๋ฒ„ํผ(buffer): ์ž‘์—…์ด ์Œ“์ž„

โœ๏ธ ์•Œ๋งž๋Š” ๊ด„ํ˜ธ ํŒ๋‹จ ์˜ˆ์ œ_Stack

import java.util.*;

public class StackTest {
    public static void main(String[] args) {

       Stack st = new Stack();
       Scanner sc = new Scanner(System.in);
       
       System.out.println("์ˆ˜์‹์„ ์ ์œผ์‹œ์˜ค: ");
       String expression = sc.next();

        System.out.println("expression" + expression);

        try {
            for(int i = 0; i < expression.length(); i++) {
                char ch = expression.charAt(i);

                if(ch == '(') {
                    st.push(ch + "");
                } else if (ch == ')') {
                    st.pop();
                }
            }
            if(st.isEmpty()) {
                System.out.println("๊ด„ํ˜ธ๊ฐ€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.");
            } else {
                System.out.println("๊ด„ํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
            }
        } catch (EmptyStackException e) {
            System.out.println("๊ด„ํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Exception");
        }
    }
}

โœ๏ธ Queue๋ฅผ ํ™œ์šฉํ•œ ์ตœ๊ทผ ์‚ฌ์šฉ๋ฌธ์„œ ์˜ˆ์ œ

import java.util.*;

public class QueueTest {
    static Queue q = new LinkedList();
    static final int MAX_SIZE = 5;

    public static void save(String input) {
        // Queue์— ์ €์žฅํ•œ๋‹ค.
        if(!"".equals(input)) { // if(input == null && !input.equals(""))
            q.offer(input);
        }
        // Queue์˜ ์ตœ๋Œ€ํฌ๊ธฐ๋ฅผ ๋„˜์œผ๋ฉด ์ œ์ผ ์ฒ˜์Œ ์ž…๋ ฅ๋œ ๊ฒƒ์„ ์‚ญ์ œํ•œ๋‹ค.
        if(q.size() > MAX_SIZE) {
            q.remove();
        }
    }

    public static void main(String[] args) {
        System.out.println("help๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋„์›€๋ง์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.");

        // ๋ฌดํ•œ๋ฐ˜๋ณต์„ ์ผ์œผ์ผœ์„œ ์ž…๋ ฅ์„ ์‹œํ‚ด
        while(true) {
            System.out.println(">>");
            try{
                Scanner sc = new Scanner(System.in);
                String input = sc.nextLine().trim(); // ์•ž๋’ค ๊ณต๋ฐฑ ์—†์•ฐ

                if("".equals(input)) {
                    continue; // ์•„์˜ˆ ๋น ์ ธ๋‚˜์™€์„œ ๋ฐ˜๋ณต๋ฌธ while๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘
                }
                if(input.equalsIgnoreCase("q")) {
                    System.exit(0);
                } else if(input.equalsIgnoreCase("help")) {
                    save(input);
                    System.out.println("help - ๋„์›€๋ง์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.");
                    System.out.println("q ๋˜๋Š” Q - ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.");
                    System.out.println(
                            "history - ์ตœ๊ทผ์— ์ž…๋ ฅํ•œ ๋ช…๋ น์–ด๋ฅผ " + MAX_SIZE + "๊ฐœ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค."
                    );
                } else if (input.equalsIgnoreCase("history")) {
                    // ์ž…๋ ฅ๋ฐ›์€ ๋ช…๋ น์–ด ์ €์žฅ
                    save(input);

                    // LinkedList์˜ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ค€๋‹ค.
                    LinkedList list = (LinkedList) q;

                    //list.size๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒ์ˆ˜๋กœ ๋‘”๋‹ค. (๋ฐ˜๋ณตํšŸ์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ์ด๋ ‡๊ฒŒ ๋‘ฌ์•ผ ํ•œ๋‹ค.)
                    final int SIZE = list.size();
                    for(int i = 0; i < SIZE; i++)
                        System.out.println((i + 1) + ". " + list.get(i));
                } else {
                    save(input);
                    System.out.println(input);
                }
            } catch (Exception e) {
                System.out.println("์ž…๋ ฅ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.");
            }
        } // while end
    }
}
help๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋„์›€๋ง์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
>>
help
help - ๋„์›€๋ง์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
q ๋˜๋Š” Q - ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
history - ์ตœ๊ทผ์— ์ž…๋ ฅํ•œ ๋ช…๋ น์–ด๋ฅผ 5๊ฐœ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
>>
history
1. help
2. history
>>
hello
hello
>>
hi
hi
>>
oh!
oh!
>>
history
1. history
2. hello
3. hi
4. oh!
5. history
>>
q

References
: https://cafe.naver.com/javachobostudy

profile
Fill in my own colorful colors๐ŸŽจ

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