πŸ–‹οΈ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜/μ•Œκ³ λ¦¬μ¦˜,자료ꡬ쑰

[μŠ€νƒ] λ°°μ—΄ 기반 μŠ€νƒκ³Ό μ—°κ²° 리슀트 기반 μŠ€νƒ

OR15A 2023. 11. 21. 14:34

Stack

  • μŠ€νƒμ€ ν›„μž…μ„ μΆœμ΄λΌλŠ” κ·œμΉ™μ— 따라 데이터λ₯Ό μ €μž₯ν•˜κ³  μ ‘κ·Όν•˜λŠ” μ„ ν˜• 자료ꡬ쑰
  • μ‚¬μš© μ˜ˆμ‹œ : μ›Ή λΈŒλΌμš°μ €μ˜ λ’€λ‘œ κ°€κΈ° κΈ°λŠ₯, λ¬Έμžμ—΄ μ—­μˆœ, κ΄„ν˜Έ 검사, μ‹€ν–‰ μ·¨μ†Œ κΈ°λŠ₯, μž¬κ·€ ν•¨μˆ˜ 호좜

 

 

μŠ€νƒμ˜ κ°œλ…
  • μŠ€νƒμ€ LIFO(Last In, First Out) λ˜λŠ” FILO(First In, Last Out) 원칙에 따라 μž‘λ™ν•˜λŠ” 자료ꡬ쑰
  • 이 원칙은 κ°€μž₯ λ§ˆμ§€λ§‰μ— μ‚½μž…λœ μš”μ†Œκ°€ κ°€μž₯ λ¨Όμ € μ œκ±°λœλ‹€λŠ” 것을 μ˜λ―Έν•¨

 

μŠ€νƒ 자료ꡬ쑰의 ADT(좔상 데이터 νƒ€μž…)
Push : μŠ€νƒμ˜ 맨 μœ„μ— μš”μ†Œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
Pop : μŠ€νƒμ˜ 맨 μœ„μ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³ , κ·Έ μš”μ†Œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
Peek : μŠ€νƒμ˜ 맨 μœ„ μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ, μ œκ±°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
IsEmpty : μŠ€νƒμ΄ λΉ„μ–΄ μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

 

 

λ°°μ—΄ 기반 μŠ€νƒ (Stack 클래슀)

κ΅¬μ„±μš”μ†Œ
  • λ‚΄λΆ€ λ°°μ—΄ : λ™μ μœΌλ‘œ 크기가 쑰정될 수 μžˆλŠ” λ°°μ—΄
  • Top 포인터 : μŠ€νƒμ˜ μ΅œμƒμœ„ μš”μ†Œ(λ§ˆμ§€λ§‰μœΌλ‘œ μΆ”κ°€λœ μš”μ†Œ)λ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터 λ˜λŠ” 인덱슀
  • Capacity : λ‚΄λΆ€ λ°°μ—΄μ˜ μ΅œλŒ€ 크기
  • Size : ν˜„μž¬ μŠ€νƒμ— μ €μž₯된 μš”μ†Œμ˜ 수

 

μž‘λ™ 원리
  • λ‚΄λΆ€ λ°°μ—΄ : Stack은 λ‚΄λΆ€μ μœΌλ‘œ 동적 배열을 μ‚¬μš©ν•˜μ—¬ μš”μ†Œλ“€μ„ μ €μž₯. 이 배열은 Vector 클래슀λ₯Ό 톡해 κ΅¬ν˜„λ˜μ–΄ 있으며, ν•„μš”μ— 따라 λ™μ μœΌλ‘œ 크기가 쑰절됨
  • Top μš”μ†Œ : μŠ€νƒμ˜ μ΅œμƒλ‹¨μ— μžˆλŠ” μš”μ†Œ(κ°€μž₯ μ΅œκ·Όμ— μΆ”κ°€λœ μš”μ†Œ)λŠ” λ‚΄λΆ€ λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μš”μ†Œλ‘œ 관리
  • Push μ—°μ‚° : μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μŠ€νƒμ˜ 맨 μœ„μ— μΆ”κ°€ν•  λ•Œ, 이 μš”μ†ŒλŠ” λ°°μ—΄μ˜ λ§ˆμ§€λ§‰μ— μΆ”κ°€. ν•„μš”ν•œ 경우 λ°°μ—΄ 크기 ν™•μž₯
  • Pop μ—°μ‚° : μŠ€νƒμ˜ 맨 μœ„μ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•  λ•Œ, λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μš”μ†Œκ°€ 제거되고 λ°˜ν™˜λ¨
  • Peek μ—°μ‚° : μŠ€νƒμ˜ μ΅œμƒλ‹¨ μš”μ†Œλ₯Ό ν™•μΈν•˜λ €λ©΄, λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό 쑰회

 

μ£Όμš” λ©”μ„œλ“œ
  • push(E item) : μŠ€νƒμ˜ μ΅œμƒλ‹¨μ— μš”μ†Œλ₯Ό μΆ”κ°€
  • pop() : μŠ€νƒμ˜ μ΅œμƒλ‹¨μ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³ , κ·Έ μš”μ†Œλ₯Ό λ°˜ν™˜. μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ” 경우 EmptyStackException을 던질 수 있음
  • peek() : μŠ€νƒμ˜ μ΅œμƒλ‹¨ μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ, μ œκ±°ν•˜μ§€ μ•ŠμŒ. μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ” 경우 EmptyStackException을 던질 수 있음
  • isEmpty() : μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό λ°˜ν™˜. λΉ„μ–΄μžˆμœΌλ©΄ true, 그렇지 μ•ŠμœΌλ©΄ falseλ₯Ό λ°˜ν™˜
  • size() : μŠ€νƒμ— μ €μž₯된 μš”μ†Œμ˜ 수λ₯Ό λ°˜ν™˜
  • search(Object o) : μ§€μ •λœ 객체가 μŠ€νƒμ—μ„œ μ–Όλ§ˆλ‚˜ 멀리 μžˆλŠ”μ§€λ₯Ό λ°˜ν™˜. μŠ€νƒμ˜ μ΅œμƒλ‹¨λΆ€ν„° κ°μ²΄κΉŒμ§€μ˜ 거리λ₯Ό 1둜 μ‹œμž‘ν•˜μ—¬ 계산. κ°μ²΄κ°€ μŠ€νƒμ— μ—†μœΌλ©΄ -1을 λ°˜ν™˜
  • elementAt(int index) : μŠ€νƒμ—μ„œ μ§€μ •λœ μΈλ±μŠ€μ— μžˆλŠ” μš”μ†Œλ₯Ό λ°˜ν™˜
  • capacity() : μŠ€νƒμ˜ ν˜„μž¬ μš©λŸ‰μ„ λ°˜ν™˜. μ΄λŠ” μŠ€νƒ λ‚΄λΆ€μ˜ 배열이 담을 수 μžˆλŠ” μš”μ†Œμ˜ μ΅œλŒ€ 수λ₯Ό λ‚˜νƒ€λƒ„
  • ensureCapacity(int minCapacity) : μŠ€νƒμ΄ μ΅œμ†Œν•œ μ§€μ •λœ μš©λŸ‰μ„ 갖도둝 함
  • trimToSize() : μŠ€νƒμ˜ μš©λŸ‰μ„ ν˜„μž¬ μŠ€νƒ 크기에 맞게 μ‘°μ •. λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ 쀄일 수 있음

 

 

 

 

μ—°κ²° 리슀트 기반 μŠ€νƒ (Deque μΈν„°νŽ˜μ΄μŠ€)

κ΅¬μ„±μš”μ†Œ
  • λ…Έλ“œ: 각 μš”μ†ŒλŠ” λ…Έλ“œλ‘œ ν‘œν˜„. λ…Έλ“œλŠ” 데이터와 λ‹€μŒ λ…Έλ“œμ— λŒ€ν•œ μ°Έμ‘°(포인터)λ₯Ό 포함
  • ν—€λ“œ 포인터: μŠ€νƒμ˜ μ΅œμƒμœ„ μš”μ†Œ(맨 처음 λ˜λŠ” λ§ˆμ§€λ§‰μ— μΆ”κ°€λœ μš”μ†Œ)λ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터
  • Size: ν˜„μž¬ μŠ€νƒμ— μ €μž₯된 μš”μ†Œμ˜ 수

 

μž‘λ™ 원리
  • λ…Έλ“œ 기반 ꡬ쑰: μŠ€νƒμ˜ 각 μš”μ†ŒλŠ” μ—°κ²° 리슀트의 λ…Έλ“œλ‘œ ν‘œν˜„. 각 λ…Έλ“œλŠ” 데이터와 λ‹€μŒ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” μ°Έμ‘°λ₯Ό 가짐
  • ν—€λ“œλ₯Ό μ‚¬μš©ν•œ μ—°μ‚°: μŠ€νƒ 연산은 μ—°κ²° 리슀트의 ν—€λ“œ(λ˜λŠ” ν…ŒμΌ)μ—μ„œ μˆ˜ν–‰λ©λ‹ˆλ‹€. μƒˆλ‘œμš΄ μš”μ†ŒλŠ” 리슀트의 ν—€λ“œμ— μΆ”κ°€λ˜λ©°, ν—€λ“œμ—μ„œ μ œκ±°λ©λ‹ˆλ‹€.
  • Push μ—°μ‚°: μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μŠ€νƒμ˜ 맨 μœ„μ— μΆ”κ°€ν•  λ•Œ, μ—°κ²° 리슀트의 ν—€λ“œμ— μƒˆ λ…Έλ“œλ₯Ό μΆ”κ°€
  • Pop μ—°μ‚°: μŠ€νƒμ˜ 맨 μœ„μ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•  λ•Œ, μ—°κ²° 리슀트의 ν—€λ“œ λ…Έλ“œλ₯Ό μ œκ±°ν•˜κ³  κ·Έ 데이터λ₯Ό λ°˜ν™˜
  • Peek μ—°μ‚°: μŠ€νƒμ˜ μ΅œμƒλ‹¨ μš”μ†Œλ₯Ό 확인할 λ•Œ, μ—°κ²° 리슀트의 ν—€λ“œ λ…Έλ“œμ˜ 데이터λ₯Ό 쑰회

 

μ£Όμš” λ©”μ„œλ“œ
  • addFirst(E item) / offerFirst(E item): μŠ€νƒμ˜ μ΅œμƒλ‹¨μ— μš”μ†Œλ₯Ό μΆ”κ°€ (ArrayDequeμ—μ„œ μ‚¬μš©)
  • removeFirst() / pollFirst(): μŠ€νƒμ˜ μ΅œμƒλ‹¨μ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³ , κ·Έ μš”μ†Œλ₯Ό λ°˜ν™˜
  • peekFirst(): μŠ€νƒμ˜ μ΅œμƒλ‹¨ μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ, μ œκ±°ν•˜μ§€ μ•ŠμŒ
  • isEmpty(): μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό λ°˜ν™˜. λΉ„μ–΄μžˆμœΌλ©΄ true, 그렇지 μ•ŠμœΌλ©΄ falseλ₯Ό λ°˜ν™˜
  • size(): μŠ€νƒμ— μ €μž₯된 μš”μ†Œμ˜ 수λ₯Ό λ°˜ν™˜
  • iterator() : λ°ν¬μ˜ μš”μ†Œλ“€μ„ μˆœνšŒν•˜λŠ” μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜
  • descendingIterator() : λ°ν¬μ˜ μš”μ†Œλ“€μ„ μ—­μˆœμœΌλ‘œ μˆœνšŒν•˜λŠ” μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜

 

 

 

λ°°μ—΄ 기반 μŠ€νƒ vs μ—°κ²° 리슀트 기반 μŠ€νƒ

  • μ„±λŠ₯ 차이
    • λ°°μ—΄ κΈ°λ°˜μ€ 랜덀 μ•‘μ„ΈμŠ€κ°€ λΉ λ₯΄μ§€λ§Œ 크기 쑰정에 λΉ„μš©μ΄ λ“­λ‹ˆλ‹€.
    • μ—°κ²° 리슀트 κΈ°λ°˜μ€ μš”μ†Œ μΆ”κ°€ 및 μ œκ±°κ°€ λΉ λ₯΄μ§€λ§Œ 랜덀 μ•‘μ„ΈμŠ€κ°€ λŠλ¦½λ‹ˆλ‹€.
  • μš©λ„
    • λ°°μ—΄ κΈ°λ°˜μ€ 크기 변동이 적고, λΉ λ₯Έ 인덱슀 기반 접근이 ν•„μš”ν•  λ•Œ μ ν•©ν•©λ‹ˆλ‹€.
    • μ—°κ²° 리슀트 κΈ°λ°˜μ€ 자주 크기가 λ³€ν•˜κ±°λ‚˜ λμ—μ„œλ§Œ μž‘μ—…μ΄ 일어날 λ•Œ μœ λ¦¬ν•©λ‹ˆλ‹€.

 

μŠ€νƒμ˜ μž₯점과 단점

  • μž₯점
    • κ°„λ‹¨ν•˜κ³  μ‚¬μš©ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.
    • λ°μ΄ν„°μ˜ μˆœμ„œκ°€ μ€‘μš”ν•œ κ²½μš°μ— μœ μš©ν•©λ‹ˆλ‹€.
  • 단점
    • 크기가 μ œν•œμ μΌ 수 μžˆμŠ΅λ‹ˆλ‹€ (특히 λ°°μ—΄ 기반).
    • 쀑간 μš”μ†Œμ— λŒ€ν•œ 접근이 λΉ„νš¨μœ¨μ μž…λ‹ˆλ‹€.

 

 

 

참고자료 : γ€Œμ‰½κ²Œ λ°°μš°λŠ” 자료ꡬ쑰 with μžλ°”γ€