Skip to content

Latest commit

Β 

History

History
118 lines (90 loc) Β· 4.84 KB

File metadata and controls

118 lines (90 loc) Β· 4.84 KB

Stack & Queue


Stack

  • μ„ ν˜• 자료ꡬ쑰의 μΌμ’…μœΌλ‘œ Last In First Out(LIFO) 즉 λ§ˆμ§€λ§‰μ— μ‚½μž…λœ 데이터가 κ°€μž₯ λ¨Όμ € ν˜ΈμΆœλ˜λ„λ‘ ν•œλ‹€λŠ” νŠΉμ§•μ„ κ°–λŠ”λ‹€.
  • 기본적인 μ‚¬μš©λ²•μ€ λ‹€μŒκ³Ό κ°™λ‹€.
public static void main(String[] args) {
    int[] arr = {10,20,30,40,50,60};
    Stack<Integer> stk = new Stack<>();
    for(int x : arr) stk.push(x);   // Stack에 κ°’ μΆ”κ°€ν•˜κΈ°

    System.out.println(stk.pop());   // Stack κ°μ²΄μ—μ„œ κ°€μž₯ 상단에 μœ„μΉ˜ν•˜κ³  μžˆλŠ” 값을 μ‚­μ œν•˜κ³  κ·Έ 값을 λ°˜ν™˜ν•œλ‹€.
    System.out.println(stk.peek());  // Stack κ°μ²΄μ—μ„œ ν˜„μž¬ κ°€μž₯ 상단에 μœ„μ°¨ν•˜κ³  μžˆλŠ” 값을 λ°˜ν™˜ν•œλ‹€. pop()κ³Ό 달리 μ‹€μ œ 값을 Stackμ—μ„œ μ‚­μ œν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.
    System.out.println(stk.size());  // Stack 객체에 μ €μž₯된 λ°μ΄ν„°μ˜ μ–‘
    System.out.println(stk.empty());  // Stack 객체에 데이터가 μ‘΄μž¬ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό 확인, isEmpty()λ₯Ό μ‚¬μš©ν•΄λ„ 결과값은 동일.
    System.out.println(stk.contains(20));   // Stack 객체가 ν•΄λ‹Ή 데이터λ₯Ό μ €μž₯ν•˜κ³  μžˆλŠ”μ§€ 확인.
}
  • stack의 ν™œμš©μ²˜

    • μ›Ή λΈŒλΌμš°μ €μ˜ 방문기둝 (λ’€λ‘œ κ°€κΈ°) : κ°€μž₯ μ΅œκ·Όμ— λ°©λ¬Έν–ˆλ˜ νŽ˜μ΄μ§€ μˆœμ„œλŒ€λ‘œ 보여쀀닀.
    • μ—­μˆœ λ¬Έμžμ—΄ λ§Œλ“€κΈ° : κ°€μž₯ λ‚˜μ€‘μ— μž…λ ₯된 λ¬ΈμžλΆ€ν„° 좜λ ₯ν•œλ‹€.
    • μˆ˜μ‹μ˜ κ΄„ν˜Έ 검사 : μ—¬λŠ” κ΄„ν˜Έμ™€ λ‹«λŠ” κ΄„ν˜Έμ˜ 개수λ₯Ό κ²€μ‚¬ν•˜λŠ”λ°μ— μ‚¬μš©λœλ‹€.
    • ν•¨μˆ˜ 콜 μŠ€νƒ : ν”„λ‘œκ·Έλž¨μ΄ ν•¨μˆ˜ 호좜(Function Call)을 좔적할 λ•Œ μ‚¬μš©ν•œλ‹€.
  • Stack Overflow & Underflow

    • μ•„λ¬΄λŸ° 데이터 μ‚½μž…μ΄ μ—†μ—ˆλ˜ μŠ€νƒμ— λŒ€ν•΄ pop 연산을 μˆ˜ν–‰ν•˜λ €κ³  ν•  μ‹œ λ°œμƒν•˜λŠ” μ—λŸ¬λ₯Ό Underflow라고 ν•œλ‹€.
    • μ •ν•΄μ§„ μŠ€νƒ μš©λŸ‰μ΄ 꽉 μ°¬ μƒνƒœμ—μ„œ 데이터λ₯Ό μΆ”κ°€λ‘œ μ €μž₯ν•˜λ €κ³  ν•  μ‹œ λ°œμƒν•˜λŠ” μ—λŸ¬λ₯Ό Overflow라고 ν•œλ‹€.

Call Stack

  • ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄μ„œ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λ“€μ˜ 정보λ₯Ό μ €μž₯ν•œλ‹€.
  • ν•¨μˆ˜κ°€ ν•˜λ‚˜ 호좜되면 ν•΄λ‹Ή ν˜ΈμΆœμ— λŒ€ν•œ μŠ€νƒμ΄ μƒμ„±λ˜μ–΄ 콜 μŠ€νƒμ— μŒ“μΈλ‹€.
import java.util.Random;

public class CallStack {
    private int rollDice(){
        Random randomDice = new Random();
        return randomDice.nextInt(6)+1; // 1~6κΉŒμ§€μ˜ μˆ«μžλ“€μ΄ λ¬΄μž‘μœ„λ‘œ λ°˜ν™˜λœλ‹€.
    }

    private void rollDiceTwiceAndAddSum(){
        int sum = 0;
        sum += rollDice();
        sum += rollDice();
        System.out.println(sum);
    }

    public static void main(String[] args) {
        CallStack T = new CallStack();
        T.rollDiceTwiceAndAddSum();
    }
}
  • 콜 μŠ€νƒ 생성 μ˜ˆμ œμ½”λ“œ μ‹€ν–‰ μˆœμ„œ image

  • 콜 μŠ€νƒμ—λŠ” μ–΄λ–€ 정보듀이 μ €μž₯λ˜λŠ”κ°€?
    • ν•¨μˆ˜ λ‚΄ μ§€μ—­ λ³€μˆ˜
    • ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜(Arguments)
    • ν˜ΈμΆœν•œ ν•¨μˆ˜(Caller)의 μŠ€νƒμ— λŒ€ν•œ 정보 (Caller ν•¨μˆ˜μ˜ 콜 μŠ€νƒ μ£Όμ†Œκ°’)
    • λ°˜ν™˜ κ°’ μ£Όμ†Œ(Return Address)에 λŒ€ν•œ 정보 (호좜된 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μ²˜λ¦¬ν•œ λ’€ μ–΄λ””λ‘œ 볡귀해야 ν•˜λŠ”μ§€μ— λŒ€ν•œ 정보)


Queue

  • stackκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μ„ ν˜• 자료ꡬ쑰의 일쒅이닀. First in First Out(FIFO)의 ꡬ쑰λ₯Ό κ°€μ§€λ©° λ¨Όμ € μ €μž₯된 데이터λ₯Ό λ¨Όμ € λ°˜ν™˜ν•˜λŠ” λ°©μ‹μœΌλ‘œ 데이터λ₯Ό κ΄€λ¦¬ν•œλ‹€.
  • 기본적인 μ‚¬μš©λ°©μ‹μ€ μ•„λž˜μ™€ κ°™λ‹€.
public static void main(String[] args) {
    int[] arr = {10,20,30,40,50,60};
    Queue<Integer> q = new LinkedList<>();  //μžλ°”μ—μ„œ QueueλŠ” LinkedList 객체둜 생성해주어야 ν•œλ‹€.

    for(int x : arr) q.offer(x);    // μƒμ„±λœ Queue 객체에 데이터 μ‚½μž…(enqueue)

    for(int x : q){
        System.out.print(x + " ");
    }
    System.out.println();

    System.out.println(q.peek());   // Queue κ°μ²΄μ—μ„œ κ°€μž₯ μ•žμ— μžˆλŠ” 값을 리턴. Queueμ—μ„œ ν•΄λ‹Ή 값을 μ‚­μ œν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.
    System.out.println(q.poll());   // Queue κ°μ²΄μ—μ„œ κ°€μž₯ μ•žμ— μžˆλŠ” 값을 리턴. Queueμ—μ„œ ν•΄λ‹Ή 값을 μ‚­μ œν•œλ‹€. (dequeue)
    System.out.println(q.contains(20)); // Queue κ°μ²΄μ—μ„œ ν•΄λ‹Ή 값이 μ €μž₯λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
    System.out.println(q.size());       // Queue 객체가 ν˜„μž¬ μ €μž₯ν•˜κ³  μžˆλŠ” κ°’μ˜ 개수λ₯Ό 리턴
    System.out.println(q.isEmpty());    // Queue 객체가 ν˜„μž¬ λΉ„μ–΄μžˆλŠ” μƒνƒœμΈμ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•΄μ„œ 리턴
}

  • queue의 ν™œμš©μ²˜ : 주둜 데이터가 μž…λ ₯된 μ‹œκ°„ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•  ν•„μš”κ°€ μžˆλŠ” 상황에 μ΄μš©ν•œλ‹€.
    • μš°μ„  μˆœμœ„κ°€ λ™μΌν•œ μž‘μ—…λ“€μ˜ μ˜ˆμ•½
    • μ„œλΉ„μŠ€ 이용자 λŒ€κΈ° 리슀트
    • μΊμ‹œ κ΅¬ν˜„




레퍼런슀