Stack

Stack์˜ ๊ตฌ์กฐ๋Š” ์ˆ˜์ง์œผ๋กœ ์Œ“์ธ ๋ฌผ๊ฑด์˜ ๋”๋ฏธ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฌผ์ฒด๋ฅผ ๊ฑท์–ด๋‚ผ ๋•Œ ๋งˆ์ง€๋ง‰ ์ถ”๊ฐ€๋œ ๊ฒƒ์ด ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋  ๊ฒƒ์ด๋‹ค. ์ ‘์‹œ๋‚˜ ์ฑ…์ด ์Œ“์—ฌ์žˆ๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•ด ๋ณด๋ฉด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” LIFO ๊ตฌ์กฐ์ด๋‹ค. LIFO๊ฐ€ ๋ฌด์—‡์ด๋ƒ๋ฉด ํ›„์ž…(Last In) ์„ ์ถœ(First Out)์„ ์˜๋ฏธํ•œ๋‹ค. Java์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์—์„œ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์—๋„ ์Šคํƒ ํ”„๋ ˆ์ž„์ด push ๋˜๊ฑฐ๋‚˜ pop ๋œ๋‹ค. ๋˜ํ•œ ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํ˜ธ์ถœ ์ˆœ์„œ๋„ stack ๊ตฌ์กฐ์™€ ๋™์ผํ•˜๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ํ•˜์ž. ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

naver๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ–ˆ๋‹ค๋ฉด ์Šคํƒ์—๋Š” ์œ„์™€ ๊ฐ™์ด ๋ธŒ๋ผ์šฐ์ €์˜ url์ด ๋‹ด๊ฒจ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ตœ์ƒ๋‹จ์— ์กด์žฌํ•˜๋Š” likedin ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋  ๊ฒƒ์ด๋‹ค.

์Šคํƒ์˜ ๊ตฌํ˜„

  1. Array

์Šคํƒ์„ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๊ตฌํ˜„์ด ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์Šคํƒ์˜ ๊ธฐ๋Šฅ(์—ฐ์‚ฐ)๋“ค์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ์ ์œผ๋กœ๋Š” ๋ฐฐ์—ด ์‚ฌ์šฉ์œผ๋กœ ์ธํ•œ ๊ณ ์ •๋œ ํฌ๊ธฐ์ด๋‹ค.

  1. Linked List

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ์Šคํƒ์„ ์ƒ์„ฑํ•˜๋ฉด ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋ณ€์ ์ด๋‹ค. ์ฆ‰, ์›ํ•˜๋Š” ๋งŒํผ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ์ ์œผ๋กœ๋Š” ๊ตฌํ˜„์ด ๋ฐฐ์—ด๋ณด๋‹ค๋Š” ๊นŒ๋‹ค๋กญ๋‹ค.

Java์—์„œ ์ œ๊ณตํ•˜๋Š” Stack

java๋Š” Stack ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

  • Obejct push(Object Item) : stack์— Object(item)์„ ์ €์žฅ

    • O(1)

  • Object pop() : ์Šคํƒ ์ตœ์ƒ๋‹จ์˜ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    • O(1)

  • Object peek() : ์Šคํƒ ์ตœ์ƒ๋‹จ์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๊บผ๋‚ด์ง€๋Š” ์•Š๋Š”๋‹ค.

    • O(1)

  • boolean empty() : ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    • O(1)

  • int size() : ์Šคํƒ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • int search(Object o) : ์ฐพ๋Š” ๊ฐ์ฒด(o)๋ฅผ ์ฐพ์•„์„œ ์œ„์น˜(index)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    • ์—†์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ index๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

    • O(N)

Stack ๋Œ€์‹  Deque?

A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class. https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Stack.htmlarrow-up-right

java ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด Stack ๋ณด๋‹ค๋Š” Dequeue๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

Deque(๋ฑ)์€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์‚ฝ์ž…ํ•˜๊ณ  ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ queue ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

dequeue๋ฅผ ๊ถŒ์žฅํ•˜๋Š” ์ด์œ ๋Š” Stack์€ Vector๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„๋˜์—ˆ๋Š”๋ฐ ์Šคํƒ์ด ๋‹จ์ ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. (๋ฉ”์„œ๋“œ๋“ค์ด ๋™๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋Š” ๋ฌธ์ œ.. etc)

๊ฒฐ๋ก ์€ Stack ๋Œ€์‹  ArrayDeque, ๋‹จ์ผ ์Šค๋ ˆ๋“œ์—์„œ๋„ ArrayDeque ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์—์„œ ์Šคํƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด LinkedBlockingDeque ๋˜๋Š” ConcurrentLinkedDeque์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.

LinkedBlockingDeque๋Š” ํ•œ ๋ฒˆ์— ๋‹จ์ผ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋ฉฐ

ConcurrentLinkedDeque๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‚˜ ํšจ์œจ์ ์ธ lock-free ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฝ์„ ์ ์œ ํ•˜๋Š” ์ƒํ™ฉ์ด๋‚˜ ๋ฐ๋“œ๋ฝ์— ๊ฑธ๋ฆฌ๋Š” ์ƒํ™ฉ์„ ๋ง‰์•„์ค€๋‹ค.

Last updated