λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ
πŸ’» Computer Science/- Data Structure, Algorithm

[μ•Œκ³ λ¦¬μ¦˜-PS] Java μ—μ„œ μŠ€νƒμ„ κ΅¬ν˜„ν•˜λŠ” 방법

by Wonit 2020. 2. 14.
이 글은 Stack의 μ‹€μ§ˆμ  μ‚¬μš©λ³΄λ‹€λŠ” μžλ°”μ—μ„œ μŠ€νƒμ„ κ΅¬ν˜„ν•˜λŠ” 것에 λͺ©μ μ„ λ‘μ—ˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ μžλ°”μ—μ„œ μ–΄λ–»κ²Œ μŠ€νƒμ΄ μ‚¬μš©λ˜λŠ”μ§€ κΆκΈˆν•˜λ‹€λ©΄ λ³€μˆ˜κ°€ λ©”λͺ¨λ¦¬μ— λ‹΄κΈ°λŠ” κ³Όμ • μŠ€νƒ ν”„λ ˆμž„ λ˜λŠ” JRE와 JVM이 μ–΄λ–»κ²Œ μ‹€ν–‰λ κΉŒ?의 글을 κ°€λ³κ²Œ 읽고 와 μ£Όμ‹œλŠ” 것을 μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€.

μŠ€νƒ Stack

기술 μŠ€νƒ (λͺ©μ μ„ λ‹¬μ„±ν•˜κΈ° μœ„ν•΄μ„œ μŠ΅λ“ν•˜κΈ° μœ„ν•œ κΈ°μˆ μ„ λ‹¨κ³„μ μœΌλ‘œ μŒ“μ•„ μ˜¬λ¦¬λŠ” 것) 등에 μ“°μ΄λŠ” 말인 μŠ€νƒμ€ 무언가λ₯Ό μŒ“μ•„ μ˜¬λ¦°λ‹€ λΌλŠ” ν‘œν˜„μœΌλ‘œ 이해해도 λ¬΄λ°©ν•˜λ‹€.

 

μŠ€νƒμ€ 데이터λ₯Ό μΌμ‹œμ μœΌλ‘œ μ €μž₯ν•˜κΈ° μœ„ν•΄ νƒ„μƒν•œ 자료ꡬ쑰둜, κ°€μž₯ λ‚˜μ€‘μ— 넣은 데이터λ₯Ό κ°€μž₯ λ¨Όμ € κΊΌλ‚Έλ‹€.

 

이λ₯Ό μ „λ¬Έ μš©μ–΄λ‘œ ν›„μž…μ„ μΆœ (LIFO, Last In First Out) 이라고 ν•œλ‹€.

ν‘Έμ‹œ (PUSH)

μŠ€νƒμ— 데이터λ₯Ό λ„£λŠ” μž‘μ—…μ„ 뜻 ν•œλ‹€.

팝 (POP)

μŠ€νƒμ— 데이터λ₯Ό κΊΌλ‚΄λŠ” μž‘μ—…μ„ 뜻 ν•œλ‹€.

Top와 Bottom

TopλŠ” μŠ€νƒμ—μ„œ ν‘Έμ‹œμ™€ νŒμ„ μˆ˜ν–‰ν•˜λŠ” κ°€μž₯ κΌ­λŒ€κΈ°λ₯Ό 뜻 ν•˜λ©°, Bottom은 μŠ€νƒμ˜ κ°€μž₯ μ•„λž«λΆ€λΆ„ λ°”λ‹₯을 λœ»ν•œλ‹€.

Int 데이터λ₯Ό μ €μž₯ν•˜λŠ” Stack λ§Œλ“€κΈ°

 

κ°„λ‹¨ν•˜κ²Œ Intν˜• 데이터λ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒμ„ λ§Œλ“€μ–΄λ³΄μž.

 

 

κ°„λ‹¨ν•˜κ²Œ 클래슀 ν•˜λ‚˜λ₯Ό μƒμ„±ν•˜μ—¬ μ„Έ κ°€μ§€μ˜ private ν•„λ“œλ₯Ό λ§Œλ“€μ–΄ 주자.

  • int ptr : μŠ€νƒμ˜ μœ„μΉ˜λ₯Ό 가리킬 포인터
  • int max : μŠ€νƒμ˜ μ΅œλŒ€ μš©λŸ‰
  • int[] stack : μŠ€νƒμ˜ λͺΈν†΅ 역할을 μˆ˜ν–‰ν•  λ°°μ—΄

 

μƒμ„±μž λ§Œλ“€κΈ°

 

λ§€κ°œλ³€μˆ˜λ‘œ μŠ€νƒμ˜ μš©λŸ‰μ„ λ°›μ•„ μŠ€νƒμ„ μƒμ„±ν•˜λŠ” μƒμ„±μžλ₯Ό λ§Œλ“€μ–΄ 보자

 

 

μƒμ„±μžλ₯Ό λ§Œλ“€μ—ˆλ‹€λ©΄ μƒμ„±μžμ— capacity λΌλŠ” λ§€κ°œλ³€μˆ˜κ°€ max에 λ“€μ–΄κ°€ μŠ€νƒμ˜ μ΅œλŒ€ μš©λŸ‰μ„ λ§Œλ“€μ–΄μ€€λ‹€. λ˜ν•œ ptr을 0으둜 μ΄ˆκΈ°ν™” μ‹œκ²¨ μŠ€νƒ ν¬μΈν„°μ˜ μœ„μΉ˜λ₯Ό μŠ€νƒμ˜ Bottom에 μœ„μΉ˜ν•˜κ²Œ ν•œλ‹€.

 

 

μ˜ˆμ™Έ 처리

 

ν˜Ήμ‹œλ‚˜ μŠ€νƒμ˜ 포인터가 잘 λͺ»λœ 곳을 κ°€λ₯΄ν‚€κ³  μžˆλ‹€κ±°λ‚˜ μŠ€νƒμ΄ 꽉 μ°¨μ„œ 더 이상 μ €μž₯이 λ˜μ§€ μ•Šμ„ λ•Œλ₯Ό μœ„ν•΄μ„œ μ˜ˆμ™Έλ₯Ό 닀뀄쀀닀.

 

 

Push와 POP

 

Push와 Pop을 μœ„ν•΄ stack[] λ°°μ—΄μ˜ ptr인덱슀λ₯Ό μ΄μš©ν•˜μ—¬ 값을 λˆ„μ  ν˜Ήμ€ λˆ„μ‚­ μ‹œν‚€λŠ” λ©”μ„œλ“œλ₯Ό λ‹€μŒκ³Ό 같이 λ§Œλ“€μ–΄ μ€€λ‹€.

 

 

전체 μ†ŒμŠ€ μ½”λ“œ

 

package chapter02_Stack;

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

    }
}

class IntStack{
    private int max;
    private int ptr;
    private int[] stack;

    // constructor
    public IntStack (int capacity){
        ptr = 0;
        max = capacity;
        try {
            stack = new int[max];
        } catch (OutOfMemoryError e) {
            max = 0;
        }
    }

    // push
    public int push(int x) throws OverflowStackException{
        if (ptr <= max){
            throw new OverflowStackException();
        }
        return stack[ptr++] = x;
    }

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

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

    // Exception
    public class EmptyStackException extends RuntimeException {
        public EmptyStackException(){}

    }
    public class OverflowStackException extends RuntimeException {
        public OverflowStackException(){}
    }
}

λŒ“κΈ€