# μŠ€νƒ (Stack)

written by sohyeon, hyemin πŸ’‘


# 1. μŠ€νƒμ΄λž€?

μŠ€νƒμ€ 데이터λ₯Ό μΌμ‹œμ μœΌλ‘œ μ €μž₯ν•˜κΈ° μœ„ν•œ μžλ£Œκ΅¬μ‘°μ΄λ‹€.
μž…μΆœλ ₯ μˆœμ„œλŠ” κ°€μž₯ λ‚˜μ€‘μ— 넣은 데이터λ₯Ό κ°€μž₯ λ¨Όμ € κΊΌλ‚΄λŠ” ν›„μž…μ„ μΆœμ˜ μˆœμ„œλ₯Ό λ”°λ₯Έλ‹€.

μžλ°” ν”„λ‘œκ·Έλž¨μ—μ„œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  μ‹€ν–‰ν•  λ•Œ ν”„λ‘œκ·Έλž¨ λ‚΄λΆ€μ—μ„œ μŠ€νƒμ„ μ‚¬μš©ν•œλ‹€.  

# 2. μŠ€νƒ λ§Œλ“€κΈ°

intν˜• 자료λ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒμ„ λ§Œλ“œλŠ” μ˜ˆμ‹œμ΄λ‹€.

# 2-1. μŠ€νƒ 본체

μŠ€νƒ 본체의 배열이닀. μΈλ±μŠ€κ°€ 0인 μš”μ†Œκ°€ μŠ€νƒμ˜ bottom이닀.
κ°€μž₯ λ¨Όμ € push된 데이터λ₯Ό μ €μž₯ν•˜λŠ” 곳은 stk[0]이닀.

class IntStack{
    int max;    // μŠ€νƒ μš©λŸ‰
    int ptr;    // μŠ€νƒ 포인터
    int[] stk;  // μŠ€νƒμ˜ 본체
}
  • max : μŠ€νƒμ˜ μš©λŸ‰, μŠ€νƒμ— μŒ“μ„ 수 μžˆλŠ” μ΅œλŒ€ 데이터 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•„λ“œ

  • ptr : μŠ€νƒμ— μŒ“μ—¬ μžˆλŠ” 데이터 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•„λ“œ, μŠ€νƒ 포인터

# 2-2. μƒμ„±μž

public class IntStack{
    private int max;
    private int ptr;
    private int[] stk;

    // μ‹€ν–‰ μ‹œ μ˜ˆμ™Έ: μŠ€νƒμ΄ λΉ„μ–΄ 있음
    public class EmptyIntStackException extends RuntimeException{
        public EmptyIntStackException(){}
    }
    // μ‹€ν–‰ μ‹œ μ˜ˆμ™Έ: μŠ€νƒμ΄ 가득 μ°Έ
    public class OverflowIntStackException extends RuntimeException{
        public OverflowIntStackException(){}
    }

    // μƒμ„±μž
    public IntStack(int capacity){
        ptr = 0;
        max = capacity;
        try{
            stk = new int[max];
        }catch(OutOfMemoryError e){
            max = 0;
        }
    }
}

생성 μ‹œ μŠ€νƒμ€ λΉ„μ–΄ μžˆμœΌλ―€λ‘œ μŠ€νƒ 포인터 ptr값을 0으둜 ν•œλ‹€.
λ§€κ°œλ³€μˆ˜ capacity둜 전달받은 값을 μŠ€νƒ μš©λŸ‰μ„ λ‚˜νƒ€λ‚΄λŠ” max에 λ³΅μ‚¬ν•˜κ³ 
μš”μ†Ÿμˆ˜κ°€ max인 λ°°μ—΄ stk의 본체λ₯Ό μƒμ„±ν•œλ‹€.

# 2-3. λ©”μ„œλ“œ

# 1) push

μŠ€νƒμ΄ κ°€λ“μ°¨μ„œ ν‘Έμ‹œν•  수 μ—†λŠ” 경우 μ˜ˆμ™Έ OverflowIntStackException을 throwν•œλ‹€.
전달받은 데이터λ₯Ό 넣을 수 있으면 stk[ptr]에 μ €μž₯ν•˜κ³ , μŠ€νƒ 포인터λ₯Ό 증가 μ‹œμΌœμ€€λ‹€.
λ©”μ„œλ“œμ˜ λ°˜ν™˜κ°’μ€ pushν•œ 값이닀.

public int push(int x) throws OverflowIntStackException{
    if(ptr>=max)
        throw enw OverflowIntStackException();
    return stk[ptr++] = x;
}

# 2) pop

μŠ€νƒμ˜ κΌ­λŒ€κΈ° 값을 μ œκ±°ν•˜κ³  κ·Έ 값을 λ°˜ν™˜ν•œλ‹€.
μŠ€νƒμ΄ λΉ„μ–΄ μžˆμ„ 경우 μ˜ˆμ™Έ EmptyIntStackException을 throwν•œλ‹€.

public int pop() throws EmptyIntStackException{
    if(ptr<=0)
        throw new EmptyIntStackException();
    return stk[--ptr];
}

# 3) peek

μŠ€νƒμ˜ κΌ­λŒ€κΈ°μ— μžˆλŠ” 값을 λ³΄λŠ” λ©”μ„œλ“œμ΄λ‹€.
μŠ€νƒμ΄ λΉ„μ–΄ μžˆμ„ 경우 μ˜ˆμ™Έ EmptyIntStackException을 throwν•œλ‹€.
λ°μ΄ν„°μ˜ μž…λ ₯κ³Ό μΆœμž…μ΄ μ—†μœΌλ―€λ‘œ μŠ€νƒ ν¬μΈν„°λŠ” λ³€ν™”ν•˜μ§€ μ•ŠλŠ”λ‹€.

public int peek() throws EmptyIntStackException{
    if(ptr<=0)
        throw enw EmptyIntStackException();
    return stk[ptr - 1];
}

# 4) indexOf

μŠ€νƒ 본체의 λ°°μ—΄ stk에 x와 같은 κ°’μ˜ 데이터가 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€,
ν¬ν•¨λ˜μ–΄ μžˆλ‹€λ©΄ λ°°μ—΄μ˜ 어디에 λ“€μ–΄ μžˆλŠ”μ§€λ₯Ό μ‘°μ‚¬ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€.

κΌ­λŒ€κΈ° μͺ½μ—μ„œ λ°”λ‹₯ μͺ½μœΌλ‘œ μ„ ν˜• 검색을 μˆ˜ν–‰ν•œλ‹€.
검색에 μ„±κ³΅ν•˜λ©΄ μ°Ύμ•„λ‚Έ μš”μ†Œμ˜ 인덱슀λ₯Ό λ°˜ν™˜, μ‹€νŒ¨ν•˜λ©΄ -1을 λ°˜ν™˜ν•œλ‹€.

public int indexOf(int x){
    for(int i=ptr-1; i>=0; i--){
        if(stk[i] == x)
            return i
    }
    return -1
}

# 5) dump

μŠ€νƒμ— μŒ“μ—¬ μžˆλŠ” λͺ¨λ“  데이터λ₯Ό λ°”λ‹₯μ—μ„œ κΌ­λŒ€κΈ° 순으둜 ν‘œμ‹œν•˜λŠ” λ©”μ„œλ“œ

public void dump(){
    if(ptr<=0)
        System.out.println("μŠ€νƒμ΄ λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€.");
    else{
        for(int i=0; i<ptr; i++)
            System.out.println(skt[i]+" ");
        System.out.println();
    }
}

# 6) κ·Έ μ™Έ

  • clear : μŠ€νƒμ˜ λͺ¨λ“  데이터λ₯Ό μ‚­μ œν•˜λŠ” λ©”μ„œλ“œ

  • capacity : μš©λŸ‰μ„ ν™•μΈν•˜λŠ” λ©”μ„œλ“œ

  • size : ν˜„μž¬ μŠ€νƒμ— μŒ“μ—¬μžˆλŠ” 데이터 수λ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œ

  • isEmpty : μŠ€νƒμ΄ λΉ„μ–΄ μžˆλŠ”μ§€ κ²€μ‚¬ν•˜λŠ” λ©”μ„œλ“œ

  • isFull : μŠ€νƒμ΄ 가득 μ°ΌλŠ”μ§€ κ²€μ‚¬ν•˜λŠ” λ©”μ„œλ“œ

public void clear(){
    ptr=0;
}

public int capacity(){
    return max;
}

public int size(){
    return ptr;
}

public boolean isEmpty(){
    return ptr<=0;
}

public boolean isFull(){
    return ptr >= max;
}
Last Updated: 12/5/2020, 11:36:44 AM