๊ด€๋ฆฌ ๋ฉ”๋‰ด

be_better

[์ž๋ฃŒ๊ตฌ์กฐ] ์Šคํƒ (Stack) ๋ณธ๋ฌธ

์ž๋ฃŒ๊ตฌ์กฐ

[์ž๋ฃŒ๊ตฌ์กฐ] ์Šคํƒ (Stack)

NiceTry 2023. 8. 10. 03:06

๋ชฉ์ฐจ

    ๐Ÿ“š ์Šคํƒ (Stack)

    ์Šคํƒ (Stack)์€ ํ›„์ž…์„ ์ถœ(Last In First Out; LIFO)์˜ ์ˆœ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…, ์‚ญ์ œํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

    • First In Last Out; FILO ๋กœ ์“ฐ์ด๊ธฐ๋„ ํ•˜์ง€๋งŒ LIFO๋ฅผ ๋” ๋งŽ์ด ์”€

     

     

    Overflow & Underflow

    ์Šคํƒ์— ๋ฐ์ดํ„ฐ๊ฐ€ Full ํ–ˆ์„ ๋•Œ ์‚ฝ์ž…์„ ์š”์ฒญํ•˜๋ฉด Overflow ๋ฐœ์ƒ

    ๋ฐ˜๋Œ€๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ Empty ์ผ ๋•Œ ์‚ญ์ œ๋ฅผ ์š”์ฒญํ•˜๋ฉด Underflow ๋ฐœ์ƒ

     

    Top

    ์Šคํƒ์€ ๊ธฐ๋‹ค๋ž€ ์ƒ์ž๊ฐ€ ์„ธ์›Œ์ ธ์žˆ๋Š” ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์ผ ์•„๋ž˜(Bottom)๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์Œ“๋Š”๋‹ค.

    ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…(push) ์‚ญ์ œ(pop)์€ ์ œ์ผ ์œ„๋ฅผ ๋œปํ•˜๋Š” Top์—์„œ๋งŒ ์ด๋ฃจ์–ด์ง„๋‹ค.


    ๐Ÿฆ‹ ์Šคํƒ์˜ ์‚ฌ์šฉ์‚ฌ๋ก€

    • ํ•จ์ˆ˜ ์ฝœ ์Šคํƒ
    • ์›น ๋ธŒ๋ผ์šฐ์ € ๋ฐฉ๋ฌธ๊ธฐ๋ก(๋’ค๋กœ๊ฐ€๊ธฐ)
    • ์‹คํ–‰ ์ทจ์†Œ(undo)
    • ์—ญ์ˆœ ๋ฌธ์ž์—ด ๋งŒ๋“ค๊ธฐ
    • ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ• (postfix) ๊ณ„์‚ฐ
    • Backtracking
    • ์ธํ„ฐ๋ŸฝํŠธ(interrupt) ์ฒ˜๋ฆฌ

    โœ๐Ÿป ์Šคํƒ ADT (์ถ”์ƒ ๋ฐ์ดํ„ฐ ํƒ€์ž…)

    create() ์Šคํƒ ์ƒ์„ฑ
    push(data) void ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
    pop() top์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜๋ฉด์„œ return
    peek() top์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  return
    contains(data) ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ true, false return
    isEmpty() ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ true, false return
    isFull() ์Šคํƒ์ด ๊ฐ€๋“ ์ฐจ์žˆ๋Š”์ง€ ํ™•์ธ true, false return
    size() ์Šคํƒ์˜ ํฌ๊ธฐ ๋ฐ˜ํ™˜ int return
    clear() void ์Šคํƒ ๋ชจ๋“  ์›์†Œ ์‚ญ์ œ
    printStack() void ์Šคํƒ์˜ ๋ชจ๋“  ์›์†Œ ์ถœ๋ ฅ

    โš™๏ธ ์Šคํƒ ๊ธฐ๋Šฅ & ๋™์ž‘์›๋ฆฌ

    ์‚ฝ์ž… (push)

    1. ์Šคํƒ์ด ๊ฐ€๋“ ์ฐจ์žˆ๋Š”์ง€ ํ™•์ธ isFull()
    2. ๊ฐ€๋“ ์ฐจ์žˆ๋‹ค๋ฉด isFull()์ด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  Overflow ๋ฐœ์ƒ
    3. ๊ฐ€๋“ ์ฐจ์žˆ์ง€ ์•Š๋‹ค๋ฉด isFull()์ด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  top์„ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
    4. ์ฆ๊ฐ€ํ•œ top์œ„์น˜์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž…(push)
    // ์Šˆ๋„ ์ฝ”๋“œ
    
    public void push(T item) {
    	if (isFull()) {
        	return Overflow;
        }
        
        top++;
        Stack(top, item);
    }

     

     

    ์‚ญ์ œ (pop)

    1. ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ isEmpty()
    2. isEmpty()๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์‚ญ์ œํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Underflow๋ฐœ์ƒ ํ›„ ์ข…๋ฃŒ
    3. isEmpty()๊ฐ€ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด top์— ์žˆ๋Š” ๊ฐ’ temp์— ๋ณด๊ด€
    4. top์„ ํ•˜๋‚˜ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.
    5. temp์— ๋ณด๊ด€๋˜์–ด์žˆ๋Š” ๊ฐ’ return
    // ์Šˆ๋„ ์ฝ”๋“œ
    
    public T pop() {
    	if (isEmpty()) {
        	return Underflow;
        }
        
        T temp = Stack(top);
        top--;
        return temp;
    }

    โฑ๏ธ ์Šคํƒ์˜ ์‹œ๊ฐ„๋ณต์žก๋„

    • ์‚ฝ์ž…(Insertion) O(1)
    • ์‚ญ์ œ(Deletion) O(1)
    • ๊ฒ€์ƒ‰(Search) O(n)

    ์‚ฝ์ž…(push)์ด๋‚˜ ์‚ญ์ œ(pop)๋Š” top์—์„œ๋งŒ ์ด๋ค„์ง€๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค. O(1)

    ๊ฒ€์ƒ‰์€ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ์„ ๋•Œ ๊นŒ์ง€ ๊ณ„์† ์ˆ˜ํ–‰ํ•ด์•ผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.