๐Ÿ—„๏ธ[์ž๋ฃŒ๊ตฌ์กฐ] Stack

๋‹ฅ๊ฐœยท2024๋…„ 7์›” 11์ผ

๊ณต๋ถ€

๋ชฉ๋ก ๋ณด๊ธฐ
5/23

1. Stack

LIFO : ๋งˆ์ง€๋ง‰์œผ๋กœ ๋“ค์–ด๊ฐ„ ๊ฒƒ, ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ด
pop()
push()
peak() : ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธ
isEmpty()

import java.util.EmptyStackException;

class Stack<T> {//๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ช…์‹œ
    class Node<T> { //๊ฐ™์€ ํƒ€์ž…์„ ๊ฐ–๋Š” ๋…ธ๋“œ ์„ ์–ธ
        private T data; //๋ฐ์ดํ„ฐ ์„ ์–ธ
        private Node<T> next; //๋‹ค์Œ ๋…ธ๋“œ ์„ ์–ธ

        public Node(T data){
            //์ƒ์„ฑ์ž์—์„œ ํ•ด๋‹น ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๋‚ด๋ถ€๋ณ€์ˆ˜์— ์ €์žฅ
            this.data = data;
        }
    }

    private Node<T> top;

    public T pop() {//top์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด
        if (top==null) {
           throw new EmptyStackException();
        }
        T item = top.data;
        top = top.next; //pop ์ดํ›„ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ top์œผ๋กœ ๋ฐ”๊ฟ”์คŒ
        return item;
    }

    public void push(T item) {
        Node<T> t = new Node<T>(item); //๋ฐ›์€ item์œผ๋กœ ๋…ธ๋“œ ์ƒ์„ฑ
        t.next = top; //์ด์ „์˜ top ๋‚ด๋ ค์ฃผ๊ธฐ
        top = t;
    }

    public T peek() {//๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธ
        if( top == null ){
            throw new EmptyStackException();
        }
        return top.data;
    }

    public boolean isEmpty() {
        return top == null; 
    }
}
public class stackJava {
    public static void main(String[] args) {
        //์ฝ”๋“œํ™•์ธ
        Stack<Integer> s = new Stack<Integer>();
        s.push(1);
        s.push(2);
        s.push(3);
        s.push(4);
        System.out.println(s.pop());
    }
}

2. Multi Stack

1) ๊ณ ์ •๊ธธ์ด

stack2_easy.java

import java.util.EmptyStackException;
import java.lang.Exception;

/**
 * Innerstack2_easy
 */
class FullStackException extends Exception {
    public FullStackException() {
        super();
    }
    public FullStackException (String msg){
        super(msg);
    }
}

class FixedMultiStacks { //๊ณ ์ •๊ธธ์ด multi Stack
    private int numOfStacks = 3; //stack์„ 3๋ถ„ํ• 
    private int stackSize;
    private int[] values; //์‹ค์ œ ๋ฐ์ดํ„ฐ
    private int[] sizes; //๊ฐ ์Šคํƒ์˜ ๋ฐ์ดํ„ฐ size

    public FixedMultiStacks (int stackSize){ //์ƒ์„ฑ์ž
        this.stackSize = stackSize; //stackSize ๋ฅผ ๋ฐ›๊ณ , ๋‚ด๋ถ€๋ณ€์ˆ˜์— ์ €์žฅ
        this.sizes = new int[numOfStacks]; //์Šคํƒ์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์ฆˆ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด ์ƒ์„ฑ
        this.values = new int[numOfStacks * stackSize]; //์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„ ์ƒ์„ฑ
    }

//๋‚ด๋ถ€ํ•จ์ˆ˜
    public boolean isEmpty(int stackNum) {
        //stack์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ; ๊ฐ stack๋ณ„๋กœ ๋”ฐ๋กœ ์•Œ๋ ค์ค˜์•ผํ•จ
        // < ์ธ์ž๋กœ ๋ช‡ ๋ฒˆ์งธ stcak์ธ์ง€ ๋ฐ›์•„์•ผ ํ•จ
        return sizes[stackNum] == 0; 
        //๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ ๊ณต๊ฐ„= sizes, size์—์„œ stackNum์ด 0์ธ์ง€ ํ™•์ธ
    }
    public boolean isFull(int stackNum){
        //stack์ด ๋‹ค ์ฐผ๋Š”์ง€
        return sizes[stackNum] == stackSize;
    }
    public int getTopIndex(int stackNum){
        //stack ๊ฐ€์žฅ ์œ„์˜ ๋ฐ์ดํ„ฐ์™€ ๋ฐฉ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ด
        int offset = stackSize * stackNum;
        int size = sizes[stackNum]; //ํ˜„์žฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ฐจ์žˆ๋Š”์ง€
        
        return offset + size -1; //๋ฐฉ๋ฒˆํ˜ธ๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋‹ˆ๊นŒ~
    }

    public void push(int stackNum, int data) throws FullStackException
    {
        if (isFull(stackNum) ){//๋‹ค ์ฐจ์žˆ์œผ๋ฉด ์˜ˆ์™ธ
            throw new FullStackException();
        }
        //๊ณต๊ฐ„์ด ๋‚จ์•„์žˆ์Œ +1 ํ›„ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
        values[getTopIndex(stackNum) + 1] = data;
        sizes[stackNum]++;
    }
    public int pop(int stackNum){
        if (isEmpty(stackNum) ){//๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
            throw new EmptyStackException();
        }
        int top = getTopIndex(stackNum); //๋ช‡ ๋ฒˆ ๋ฐฉ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”์ง€ ๋ฐฉ ๋ฒˆํ˜ธ ํš๋“
        int data = values[top];
        values[top] = 0;//๊ณต๊ฐ„ ๋น„์›Œ์คŒ
        sizes[stackNum]--;
        return data;
    }
    public int peek(int stackNum){//ํ™•์ธ
        if (isEmpty(stackNum)){
            throw new EmptyStackException();
        }
        return values[getTopIndex(stackNum)];
    }
}
public class stack2_easy {
    public static void main(String[] args) {
        FixedMultiStacks ms = new FixedMultiStacks(5); //stacksize=5
    
        //๋ฐ์ดํ„ฐ๋ฅผ pushํ•  ๋•Œ FullstackException ๋ฐœ์ƒ ๊ฐ€๋Šฅ
        try {
            ms.push(0, 1);
            ms.push(0, 2);
            ms.push(0, 3);
            ms.push(0, 4);
            ms.push(0, 5);
            ms.push(0, 5);//fullStackException์œผ๋กœ..
        } catch (FullStackException e) {//5๊ฐœ ์ด์ƒ ๋„ฃ์œผ๋ฉด exception
            System.out.println("It's full.");
        }

        try {
            System.out.println(ms.pop(0)); //5
            System.out.println(ms.peek(0));
            System.out.println(ms.pop(0));//4
            System.out.println(ms.isEmpty(0));
            System.out.println(ms.pop(0)); //3
            System.out.println(ms.pop(0));//2
            System.out.println(ms.pop(0));//1
            System.out.println(ms.isEmpty(0));//True
            
        } catch (EmptyStackException e) {
            System.out.println("It's empty.");
        }
    }
    
}

2) ๊ฐ€๋ณ€๊ธธ์ด

์œ ๋™์ .. ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋” ์–ด๋ ค์›Œ์šฉ
๊ณ ์ •๊ธธ์ด ๋ถ„ํ• : ์Šคํƒ์— ์ž๋ฆฌ๊ฐ€ ๋‹ค ์ฐจ๋ฒ„๋ฆฌ๋ฉด, ๋‹ค๋ฅธ์Šคํƒ์— ์ž๋ฆฌ๊ฐ€ ๋งŽ์•„๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ๋ชปํ•จ

๋ฐ์ดํ„ฐ๋ฅผ shift ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰
0๏ธโƒฃ-- 1๏ธโƒฃ1๏ธโƒฃ1๏ธโƒฃ 2๏ธโƒฃ2๏ธโƒฃ-
0๏ธโƒฃ-- 1๏ธโƒฃ1๏ธโƒฃ1๏ธโƒฃ1๏ธโƒฃ 2๏ธโƒฃ2๏ธโƒฃ
โ† 2๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ณต์‚ฌ,๋ณต์‚ฌํ•ด์„œ stack1 ์ž๋ฆฌ๋ฅผ ๋„“ํž˜
โ† stack1์˜ ํฌ๊ธฐ +1, 3โ†’4
โ† stack2์˜ ์‹œ์ž‘์ +1, ํฌ๊ธฐ -1


์—ฌ๊ธฐ์„œ ๋” ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด??
๋ฐฉ์„ ์›ํ˜• Que์ฒ˜๋Ÿผ ๋Œ๋ ค์„œ! stack0์— ์ถ”๊ฐ€
0๏ธโƒฃ-- 1๏ธโƒฃ1๏ธโƒฃ1๏ธโƒฃ1๏ธโƒฃ 2๏ธโƒฃ2๏ธโƒฃ
2๏ธโƒฃ0๏ธโƒฃ- 1๏ธโƒฃ1๏ธโƒฃ1๏ธโƒฃ1๏ธโƒฃ 2๏ธโƒฃ2๏ธโƒฃ
โ† stack2์˜ ํฌ๊ธฐ+1
โ† stack0์˜ ์‹œ์ž‘์  +1, ํฌ๊ธฐ -1

๋ฐฐ์—ด[๋ฐฉ๋ฒˆํ˜ธ] = ๋ฐฐ์—ด[๋ฐฉ๋ฒˆํ˜ธ-1] โ† ์•ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋’ค๋กœ ๋ฐ€๋„๋ก, ์ž๊ธฐ ์Šคํƒ์˜ ์‹œ์ž‘์  ๋งŒ๋‚˜๊ธฐ๊นŒ์ง€ ๊ฒŒ์† ๋Œ๋ฆผ
โ—๏ธ์ด ๋•Œ, 2๋ฒˆ๋ฐฉ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ 0๋ฒˆ๋ฐฉ์— ๋„ฃ๋Š”์ง€?

โœ“ Modulo ์˜ Wrapping Around

Modulo : mod() ํ•จ์ˆ˜๋‚˜ % ์—ฐ์‚ฐ์ž โ† ์ •ํ•ด์ง„ ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ํŠน์„ฑ
0 1 2 3 4 ๋ฐฉ์ด ์žˆ์„ ๋•Œ 5๋ฒˆ๋ฐฉ์— ๋„ฃ๊ณ ์‹ถ์€๋ฐ ์—†์Œ. 5%5(๋ฐฉ๊ฐฏ์ˆ˜)=0 โ† 0๋ฒˆ ๋ฐฉ์—์„œ ์‹คํ–‰

๊ฐ€์ƒ์˜ index -1์„ ์‚ฌ์šฉ, max: stack ์ „์ฒด๊ธธ์ด
-1 % max

stack2_dynam.java

3. 10828 ๋ฌธ์ œํ’€์ด


//java๋กœ stack ๋ฌธ์ œํ’€์ด
import java.util.EmptyStackException;
import java.util.Scanner;
import java.util.Stack;

//push X: ์ •์ˆ˜ X๋ฅผ ์Šคํƒ์— ๋„ฃ๋Š” ์—ฐ์‚ฐ์ด๋‹ค.
//pop: ์Šคํƒ์—์„œ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ์ •์ˆ˜๋ฅผ ๋นผ๊ณ , ๊ทธ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์Šคํƒ์— ๋“ค์–ด์žˆ๋Š” ์ •์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.
//size: ์Šคํƒ์— ๋“ค์–ด์žˆ๋Š” ์ •์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
//empty: ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด 1, ์•„๋‹ˆ๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.
//top: ์Šคํƒ์˜ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ์ •์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ •์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.



// class Stack<T> {//ํด๋ž˜์Šค ์„ ์–ธ
// }

public class stack_10828 {
    public static void main(String[] args) {
//์ฒซ์งธ ์ค„์— ์ฃผ์–ด์ง€๋Š” ๋ช…๋ น์˜ ์ˆ˜ N (1 โ‰ค N โ‰ค 10,000)์ด ์ฃผ์–ด์ง„๋‹ค. 
//๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๋ช…๋ น์ด ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค.

        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();

        Stack<Integer> stack = new Stack<Integer>();
        //push, pop, add, clear, peek, isEmpty, search
        int size=0;
        for (int i=0; i<N; i++){ //๋ช…๋ น ๋ฐ›๊ธฐ
            String cmd = sc.next(); //๋‹จ์–ด๋งŒ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค
            int cmdInt;
            
            if ("push".equals(cmd)) {
                cmdInt = sc.nextInt();
                stack.push(cmdInt);
                size++;
            }
            if ("pop".equals(cmd)) {
                if (stack.isEmpty() == true) {//์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด
                    System.out.println("-1");
                }
                System.out.println(stack.pop());
                size--;
            }
            if ("size".equals(cmd)) {
                System.out.println(size);
            }
            if ("empty".equals(cmd)) {
                if (stack.isEmpty() == true) {//์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด
                    System.out.println("-1");
                }
                else System.out.println("0");
            }
            if ("top".equals(cmd)) {
                System.out.println(stack.peek());
            }

        }

        sc.close();
    }
}

ํ•œ๋ฒˆ์— ๋„ฃ์œผ๋ฉด ์‹คํ–‰์ด ์•ˆ๋˜๊ตฌ.. ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค..

[์ž๋ฃŒ๊ตฌ์กฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜] Stack ๊ตฌํ˜„ํ•˜๊ธฐ in Java https://youtu.be/whVUYv0Leg0?si=G_FnJjdjpXH8Bdk1
๋ฐฑ์ค€ ์ž๋ฃŒ๊ตฌ์กฐ 10828_Stack๋ฌธ์ œ https://www.acmicpc.net/problem/10828

profile
๋ฐœ๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”๋”ฉ๊ณต๋ถ€

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