๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Java/๐Ÿ’พ ์ž๋ฃŒ๊ตฌ์กฐ

[ Java ] Stack? ๊ทธ๋ƒฅ ์Œ“๊ธฐ๋งŒ ํ•˜๋Š” ์ค„ ์•Œ์•˜์ง€,,

by carrot0911 2025. 3. 28.

๐Ÿ’ก ๊ณต๋ถ€ํ•˜๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•˜๋ ค๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์—์„œ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์Šคํƒ/ํ ๊ฐœ๋…์ด ํ•„์š”ํ•œ ๋ฌธ์ œ๋ฅผ ๋งˆ์ฃผํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ํ•ด๋‹น ๊ฐœ๋…์„ ์ž˜ ์•Œ์ง€ ๋ชปํ–ˆ๋˜ ๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ํ’€์ง€ ๋ชปํ•˜๊ณ  ๊ทธ๋Œ€๋กœ ๋ฒฝ์— ๋ถ€๋”ชํžˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋ฌธ์ œ๋งŒ ๊ณ„์† ํ‘ธ๋Š” ๊ฑด ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฑธ ๋Š๊ผˆ๊ณ , "๊ฐœ๋…์„ ๋จผ์ € ์ œ๋Œ€๋กœ ์žก๊ณ  ๋ฌธ์ œ๋ฅผ ํ’€์ž!"๋Š” ๋งˆ์Œ์œผ๋กœ ์Šคํƒ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 


 

๐Ÿ“ฆ Stack,, ๊ทธ๋ž˜์„œ ๊ทธ๊ฒŒ ๋„๋Œ€์ฒด ๋ญ”๋ฐ?!

Stack ์ปฌ๋ ‰์…˜

์Šคํƒ(Stack)์€ ๋ง ๊ทธ๋Œ€๋กœ '์Œ“๋‹ค', '๋”๋ฏธ'๋ผ๋Š” ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
์ƒ์ž๋ฅผ ํ•˜๋‚˜์”ฉ ์œ„๋กœ ์Œ“์•„ ์˜ฌ๋ฆฌ๋“ฏ์ด, ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจ๊ณก์ฐจ๊ณก ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์Œ“๊ณ  ๊บผ๋‚ด๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค!

LIFO(Last In First Out) ๊ตฌ์กฐ๋Š” ๋ญ์ง€..?!
์Šคํƒ์€ LIFO ๊ตฌ์กฐ์ด๋‹ค.
๋ง ๊ทธ๋Œ€๋กœ ๋งˆ์ง€๋ง‰์— ๋„ฃ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ์ผ ๋จผ์ € ๋‚˜์˜ค๋Š” ๊ตฌ์กฐ์ด๋‹ค!

LIFO ์˜ˆ์‹œ

 

 

๐Ÿ“Œ Stack์€ ์–ด๋””์—์„œ ์“ฐ์ผ๊นŒ?

Java๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ (JVM)์˜ Runtime Data Area ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์šธ ๋•Œ, ๊ทธ ์ค‘ ํ•˜๋‚˜๋กœ Stack ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋“ค์–ด๋ณธ ์ ์ด ์žˆ๋‹ค.
Stack ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ง€์—ญ ๋ณ€์ˆ˜์™€ ํ˜ธ์ถœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ธ๋ฐ, ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์“ด ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๋จผ์ € ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ํšจ์œจ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ฆ‰, Stack์˜ ๊ตฌ์กฐ์  ํŠน์„ฑ์ด ์‹ค์ œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์—๋„ ๊ทธ๋Œ€๋กœ ์“ฐ์ด๊ณ  ์žˆ๋‹ค!
์ด๊ฒŒ ๋ฐ”๋กœ ์Šคํƒ์ด ๋‹จ์ˆœํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ๋„˜์–ด, ์‹ค์ œ ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ๋„ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

โ˜• Java์˜ Stack ํด๋ž˜์Šค

Java์—์„œ Stack ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณต๋œ๋‹ค.
์ด ํด๋ž˜์Šค๋Š” Vector ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ์–ด์„œ, ๊ธฐ๋ณธ์ ์œผ๋กœ Thread-Safe ํ•˜๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ฆ‰, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์ ‘๊ทผํ•ด๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!
์ตœ๊ทผ์—๋Š” Deque๋‚˜ LinkedList๋ฅผ ์Šคํƒ์ฒ˜๋Ÿผ ์“ฐ๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์ด ์žˆ๋‹ค ๐Ÿ˜„

 

๐Ÿ› ๏ธ Stack์€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ๊นŒ?

Java์—์„œ๋Š” java.util.Stack ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

import java.util.Stack;

๐Ÿ“‹ ์ฃผ์š” ๋ฉ”์„œ๋“œ ์ •๋ฆฌ

  • empty() : Stack์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋น„์–ด์žˆ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค!
  • push(Object item) : Stack์— ๊ฐ์ฒด(item)๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์œ„์— ์Œ“๋Š” ๋™์ž‘์ด๋‹ค!
  • peek() : Stack์˜ ์ตœ์ƒ๋‹จ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์ง€๋Š” ์•Š๋Š”๋‹ค!
                    Stack์ด ๋น„์–ด ์žˆ๋‹ค๋ฉด EmptyStackException์ด ๋ฐœ์ƒํ•œ๋‹ค.
  • pop() : Stack์˜ ์ตœ์ƒ๋‹จ ๊ฐ’์„ ๊บผ๋‚ธ๋‹ค. ๊บผ๋‚ด๋ฉด์„œ ๊ฐ’์ด ์‚ญ์ œ๋œ๋‹ค!
                  Stack์ด ๋น„์–ด ์žˆ๋‹ค๋ฉด EmptyStackException์ด ๋ฐœ์ƒํ•œ๋‹ค.
  • size() : ํ˜„์žฌ Stack์— ์Œ“์—ฌ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ๋ ค์ค€๋‹ค!
์Šคํƒ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ํŠน์ง•

Stack ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋™์  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์„œ,
ArrayList์ฒ˜๋Ÿผ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค!

์Šคํƒ์ด ์ฒ˜์Œ ์ƒ์„ฑ๋˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ 10๊ฐœ์˜ ๊ณต๊ฐ„์ด ํ• ๋‹น๋œ๋‹ค.
๋ฐ์ดํ„ฐ๊ฐ€ 10๊ฐœ๋ฅผ ๋„˜์–ด๊ฐ„๋‹ค๋ฉด?!
๐Ÿ‘‰ ํ˜„์žฌ ์‚ฌ์ด์ฆˆ์˜ 2๋ฐฐ ํฌ๊ธฐ๋กœ ์ž๋™ ํ™•์žฅ๋˜๊ณ , ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋Š” ์ƒˆ๋กœ์šด ๊ณต๊ฐ„์— ๋ณต์‚ฌ๋œ๋‹ค!

๋•๋ถ„์— ์œ ์—ฐํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ณ , ์‹ค์ œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‚˜ ์‹ค๋ฌด์—์„œ๋„ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค!

 

 

๐ŸŒ€ Stack ๋Œ€์‹  Deque๋ฅผ ์‚ฌ์šฉํ•˜์ž!!

Java ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ์‚ฌ์‹ค Stack ํด๋ž˜์Šค๋Š” ์ƒ์† ์„ค๊ณ„๊ฐ€ ์ž˜๋ชป๋œ ํด๋ž˜์Šค๋ผ๊ณ  ๋‚˜์™€ ์žˆ๋‹ค.
Vector๋ฅผ ์ƒ์†๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด ์žˆ๊ณ , ์˜ค๋ž˜๋œ ๋ฐฉ์‹์ด๋ผ ์ง€๊ธˆ์€ Deque๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ณต์‹์œผ๋กœ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค!

Deque๊ฐ€ ๋ญ์ง€..?

Deque(Double-Ended Queue)๋Š” ์–‘์ชฝ ๋์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋บ„ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค!

ํ(Queue)๋กœ๋„, ์Šคํƒ(Stack)์œผ๋กœ๋„ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!
์ƒํ™ฉ์— ๋”ฐ๋ผ ์ž…๋ง›๋Œ€๋กœ ์“ฐ๊ธฐ ๋”ฑ ์ข‹๋‹ค ๐Ÿ˜Ž

Deque ์„ค๋ช…

Deque๋ฅผ Stack์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ

๋”๋ณด๊ธฐ
Deque<String> stack = new ArrayDeque<>();

stack.push("a");
stack.push("b");
stack.push("c");
stack.push("d");
stack.push("e");

System.out.println(stack); // [a, b, c, d, e]

System.out.println(stack.pop()); // e
System.out.println(stack.pop()); // d

System.out.println(stack); // [a, b, c]

Deque๋ฅผ Queue์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ

๋”๋ณด๊ธฐ
Deque<String> queue = new ArrayDeque<>();

queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("d");
queue.offer("e");

System.out.println(queue); // [a, b, c, d, e]

System.out.println(queue.poll()); // a
System.out.println(queue.poll()); // b

System.out.println(queue); // [c, d, e]
์‚ฌ์šฉ ๋ฐฉ์‹ ๋ฉ”์„œ๋“œ ๊ตฌ์กฐ ์„ค๋ช…
Stack์ฒ˜๋Ÿผ push(), pop() LIFO ๋‚˜์ค‘์— ๋„ฃ์€ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๊บผ๋ƒ„
Queue์ฒ˜๋Ÿผ offer(), poll() FIFO ๋จผ์ € ๋„ฃ์€ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๊บผ๋ƒ„

 


๐Ÿ”— References

https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-Stack-%EA%B5%AC%EC%A1%B0-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%A0%95%EB%A6%AC

 

๐Ÿงฑ ์ž๋ฐ” Stack ๊ตฌ์กฐ & ์‚ฌ์šฉ๋ฒ• ์ •๋ฆฌ

Stack ์ปฌ๋ ‰์…˜ ์Šคํƒ(Stack)์˜ ์‚ฌ์ „์  ์ •์˜๋Š” '์Œ“๋‹ค', '๋”๋ฏธ' ๋กœ์„œ ์ ‘์‹œ ์Šคํƒ์ฒ˜๋Ÿผ ์ ‘์‹œ๋ฅผ ์Œ“์•„๋†“์€ ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ฆ‰, ์ƒ์ž์— ๋ฌผ๊ฑด์„ ์Œ“์•„ ์˜ฌ๋ฆฌ๋“ฏ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ

inpa.tistory.com

https://www.programiz.com/dsa/stack

 

Stack Data Structure and Implementation in Python, Java and C/C++

A stack is a linear data structure that follows the principle of Last In First Out (LIFO). This means the last element inserted inside the stack is removed first. You can think of the stack data structure as the pile of plates on top of another. Stack repr

www.programiz.com