250x250
Rainbow๐ŸŒˆCoder
My dev Note๐Ÿ“’
Rainbow๐ŸŒˆCoder
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (411)
    • ๊ณต์ง€์‚ฌํ•ญ (0)
    • Debugger (10)
      • Visual Studio Debugger (1)
      • Chrome DevTools (3)
      • Visual Studio Code Debugger (4)
      • eclipse (1)
      • intelliJ (1)
    • OOP (2)
      • OOP (2)
    • TypeScript (54)
      • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ TypeScript (54)
    • Javascript (87)
      • Javascript (45)
      • Node.js (19)
      • React (5)
      • FE ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ค์ • (3)
      • React์™€ Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ (6)
      • next.js (2)
      • pixi.js (7)
    • ๋งˆํฌ์—… (23)
      • Html & Css (23)
    • C# (80)
      • C# (12)
      • ์ด๊ฒƒ์ด C#์ด๋‹ค (68)
    • C++ (30)
      • c++ (27)
      • win api (3)
    • Unity (18)
      • Unity(๊ธฐ์ดˆ) (8)
      • Unity(C#์ค‘๊ธ‰) (5)
      • ์œ ๋‹ˆํ‹ฐ ํฌํ†ค(๋„คํŠธ์›Œํฌ) (4)
      • unity c# MyCode (1)
    • Java & Spring (29)
      • Java (11)
      • ์Šคํ”„๋ง (8)
      • Java Algorithm (9)
      • Javs Data Structures (1)
    • ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (15)
      • ์ž๋ฃŒ๊ตฌ์กฐ (5)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
    • ํ˜•์ƒ๊ด€๋ฆฌ (15)
      • Git (11)
      • ์†Œ์ŠคํŠธ๋ฆฌ (3)
    • ๊ทธ๋ž˜ํ”ฝ์Šค (7)
      • WebGl (7)
    • AWS (3)
      • aws (3)
    • ๋ฆฌ๋ˆ…์Šค (5)
      • ๋ฆฌ๋ˆ…์Šค (5)
    • ์ฑ… ๋ฆฌ๋ทฐ (13)
      • ํด๋ฆฐ์ฝ”๋“œ(์ฑ…๋ฆฌ๋ทฐ) (3)
      • ์œ ์ง€๋ณด์ˆ˜๊ฐ€๋Šฅํ•œ์ฝ”๋”ฉ์˜๊ธฐ์ˆ C#ํŽธ(์ฑ…๋ฆฌ๋ทฐ) (1)
      • ๋ฆฌํŒฉํ† ๋ง(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธํŒ) (9)
    • Server (2)
      • ๊ฒŒ์ž„ ์„œ๋ฒ„(๋„คํŠธ์›Œํฌ, ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ,OS) (2)
    • ์„ค๊ณ„, ์•„ํ‚คํ…์ณ (4)
    • ํŒŒ์ด์ฌ (5)
    • ๋””์ž์ธํŒจํ„ด (2)
    • mocha (2)
    • Jest (1)
    • Spine (1)
    • ์ธ๊ณต์ง€๋Šฅ (1)
      • ํ˜ผ์ž๊ณต๋ถ€ํ•˜๋Š”๋จธ์‹ ๋Ÿฌ๋‹+๋”ฅ๋Ÿฌ๋‹ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • MySQL
  • ์ปดํฌ์ง€์…˜
  • ์œ„์ž„
  • ใ…ฃใ„ท

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Rainbow๐ŸŒˆCoder

My dev Note๐Ÿ“’

[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ stack ๊ตฌํ˜„ํ•˜๊ธฐ
TypeScript/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ TypeScript

[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ stack ๊ตฌํ˜„ํ•˜๊ธฐ

2022. 4. 25. 16:34
728x90

๊ฐ์ข… ์ž๋ฃŒ๊ตฌ์กฐ๋“ค๋„ 'ํด๋ž˜์Šค'์ด๋‹ค.

๊ฐ€๋ น C#์˜ stack ํด๋ž˜์Šค๋Š” ๋‹ค์Œ ๋งํฌ์™€ ๊ฐ™๋‹ค.

https://docs.microsoft.com/ko-kr/dotnet/api/system.collections.stack?view=net-6.0 

 

Stack ํด๋ž˜์Šค (System.Collections)

์ œ๋„ค๋ฆญ์ด ์•„๋‹Œ ๊ฐœ์ฒด์˜ ๊ฐ„๋‹จํ•œ LIFO(Last In First Out: ๋งˆ์ง€๋ง‰์— ๋“ค์–ด๊ฐ„ ๊ฒƒ๋ถ€ํ„ฐ ์‚ฌ์šฉ) ์ปฌ๋ ‰์…˜์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

docs.microsoft.com

Stack ํด๋ž˜์Šค

 

์ •์˜

์ œ๋„ค๋ฆญ์ด ์•„๋‹Œ ๊ฐœ์ฒด์˜ ๊ฐ„๋‹จํ•œ LIFO(Last In First Out: ๋งˆ์ง€๋ง‰์— ๋“ค์–ด๊ฐ„ ๊ฒƒ๋ถ€ํ„ฐ ์‚ฌ์šฉ) ์ปฌ๋ ‰์…˜์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
 
public class Stack : ICloneable, System.Collections.ICollection

 

์ƒ์†  Object -> Stack
๊ตฌํ˜„ ICollection  IEnumerable  ICloneable

์˜ˆ์ œ

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” Stack์— ๊ฐ’์„ ๋งŒ๋“ค๊ณ  ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํ•ด๋‹น ๊ฐ’์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค.

C#๋ณต์‚ฌ
 
using System;
using System.Collections;
public class SamplesStack  {

   public static void Main()  {

      // Creates and initializes a new Stack.
      Stack myStack = new Stack();
      myStack.Push("Hello");
      myStack.Push("World");
      myStack.Push("!");

      // Displays the properties and values of the Stack.
      Console.WriteLine( "myStack" );
      Console.WriteLine( "\tCount:    {0}", myStack.Count );
      Console.Write( "\tValues:" );
      PrintValues( myStack );
   }

   public static void PrintValues( IEnumerable myCollection )  {
      foreach ( Object obj in myCollection )
         Console.Write( "    {0}", obj );
      Console.WriteLine();
   }
}


/*
This code produces the following output.

myStack
    Count:    3
    Values:    !    World    Hello
*/

์„ค๋ช…

์šฉ๋Ÿ‰์€ Stack ๋ณด์œ ํ•  ์ˆ˜ ์žˆ๋Š” Stack ์š”์†Œ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€ Stack๋˜๋ฉด ์žฌํ• ๋‹น์„ ํ†ตํ•ด ํ•„์š”์— ๋”ฐ๋ผ ์šฉ๋Ÿ‰์ด ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

์ƒˆ ๊ฐœ๋ฐœ์— ํด๋ž˜์Šค๋ฅผ Stack ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ œ๋„ค๋ฆญ System.Collections.Generic.Stack<T> ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์Šคํƒ Push ์šฉ๋Ÿ‰๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ Count ์ž‘์—…์ž…๋‹ˆ๋‹คO(1). ์ƒˆ ์š”์†Œ๋ฅผ Push ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด ์šฉ๋Ÿ‰์„ ๋Š˜๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘์—…์ด n Count๋ฉ๋‹ˆ๋‹คO(n). Pop ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค O(1) .

Stack ๋Š” null ์œ ํšจํ•œ ๊ฐ’์œผ๋กœ ํ—ˆ์šฉ๋˜๊ณ  ์ค‘๋ณต ์š”์†Œ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž

Stack() ๋น„์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ๊ธฐ๋ณธ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰์„ ๊ฐ€์ง€๋Š” Stack ํด๋ž˜์Šค์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
Stack(ICollection) ์ง€์ •ํ•œ ์ปฌ๋ ‰์…˜์—์„œ ๋ณต์‚ฌ๋œ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ๋ณต์‚ฌ๋œ ์š”์†Œ์˜ ์ˆ˜์™€ ๊ฐ™์€ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰์„ ๊ฐ€์ง€๋Š” Stack ํด๋ž˜์Šค์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
Stack(Int32) ๋น„์–ด ์žˆ๋Š” ์ƒํƒœ์ด๊ณ  ์ง€์ •ํ•œ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰๊ณผ ๊ธฐ๋ณธ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰ ์ค‘์—์„œ ๋” ํฐ ์šฉ๋Ÿ‰์„ ๊ฐ€์ง€๋Š” Stack ํด๋ž˜์Šค์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ

Count Stack์— ํฌํ•จ๋œ ์š”์†Œ ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
IsSynchronized Stack์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ๋™๊ธฐํ™”๋˜์–ด ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธ๋˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
SyncRoot Stack์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ

Clear() Stack์—์„œ ๊ฐœ์ฒด๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
Clone() Stack์˜ ๋ถ€๋ถ„ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
Contains(Object) Stack์— ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
CopyTo(Array, Int32) ์ง€์ •๋œ ๋ฐฐ์—ด ์ธ๋ฑ์Šค์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ธฐ์กด 1์ฐจ์› Array์— Stack๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
Equals(Object) ์ง€์ •๋œ ๊ฐœ์ฒด๊ฐ€ ํ˜„์žฌ ๊ฐœ์ฒด์™€ ๊ฐ™์€์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
(๋‹ค์Œ์—์„œ ์ƒ์†๋จ Object)
GetEnumerator() IEnumerator์˜ Stack๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
GetHashCode() ๊ธฐ๋ณธ ํ•ด์‹œ ํ•จ์ˆ˜๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
(๋‹ค์Œ์—์„œ ์ƒ์†๋จ Object)
GetType() ํ˜„์žฌ ์ธ์Šคํ„ด์Šค์˜ Type์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
(๋‹ค์Œ์—์„œ ์ƒ์†๋จ Object)
MemberwiseClone() ํ˜„์žฌ Object์˜ ๋‹จ์ˆœ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
(๋‹ค์Œ์—์„œ ์ƒ์†๋จ Object)
Peek() Stack์˜ ๋งจ ์œ„์—์„œ ๊ฐœ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
Pop() Stack์˜ ๋งจ ์œ„์—์„œ ๊ฐœ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
Push(Object) ๊ฐœ์ฒด๋ฅผ Stack์˜ ๋งจ ์œ„์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
Synchronized(Stack) ๋™๊ธฐํ™”๋˜์–ด ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธ๋˜๋Š” Stack์˜ ๋ž˜ํผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
ToArray() Stack์„ ์ƒˆ ๋ฐฐ์—ด์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
ToString() ํ˜„์žฌ ๊ฐœ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
(๋‹ค์Œ์—์„œ ์ƒ์†๋จ Object)

 

์ถ”๊ฐ€ ์ •๋ณด

  • Stack<T>

 

์œ„์˜ stack ํด๋ž˜์Šค๋ฅผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์Šค๋Ÿฝ๊ฒŒ ๊ฐ„๋žตํ™”ํ•ด์„œ ๊ตฌํ˜„ํ•ด๋ณด๋Š” ํฌ์ŠคํŒ…์ด๋‹ค.

 

 

๋‹จ์ผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ํ™œ์šฉ

์•„์ดํ…œ๋งˆ๋‹ค ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์”ฉ ์žˆ์–ด, ๊ฐ์ž ๋‹ค์Œ ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค.

ํ—ค๋“œ(์ฒ˜์Œ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ)๋Š” ์ฒซ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค. 

 

<๋‹จ์ผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์Šคํƒ ๊ตฌํ˜„์— ์ ์šฉ>

 

์ฒ˜์Œ์—” ํ—ค๋“œ๊ฐ€ ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ”๋ผ๋ณด์ง€ ์•Š๊ณ  ์ฒซ ๋…ธ๋“œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์ฒซ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋œ๋‹ค.

๋‘๋ฒˆ์งธ ๋…ธ๋“œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋‘๋ฒˆ์งธ ๋…ธ๋“œ๋Š” ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

์ด์ œ ํ—ค๋“œ๋Š” ๋‘๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๋„๋ก ๋งŒ๋“ ๋‹ค.

์—ฌ๊ธฐ์„œ pop()์„ ํ•˜๋ฉด ํ—ค๋“œ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋…ธ๋“œ(๋‘๋ฒˆ์งธ  ๋…ธ๋“œ)๋ฅผ ์ฐพ์•„์„œ,

๊ทธ ๋…ธ๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ด์ „์˜ ๋…ธ๋“œ(์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ)๋ฅผ ํ—ค๋“œ๊ฐ€ ๋ฐ”๋ผ๋ณด๋„๋ก ๋ณ€๊ฒฝํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋‘๋ฒˆ์งธ ๋…ธ๋“œ๋Š” ๋ฌด์‹œ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋‹ค์‹œ pop()์„ ํ•˜๋ฉด   

ํ—ค๋“œ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋…ธ๋“œ(์ฒซ๋ฒˆ์งธ  ๋…ธ๋“œ)๋ฅผ ์ฐพ์•„์„œ,

๊ทธ ๋…ธ๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ด์ „์˜ ๋…ธ๋“œ๋ฅผ ํ—ค๋“œ๊ฐ€ ๋ฐ”๋ผ๋ณด๋„๋ก ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š”๋ฐ

์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ด์ „ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ, 

ํ—ค๋“œ๊ฐ€ null์„ ๋ฐ”๋ผ๋ณด๋„๋ก ๋งŒ๋“ ๋‹ค.

์ด์ œ ํ—ค๋“œ๊ฐ€ null์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์Šคํƒ์€ ํ……ํ…… ๋น„์–ด์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

(๋‘๋ฒˆ์งธ ๋…ธ๋“œ์™€ ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๊ฐ€ ์žˆ๊ธด ํ•˜์ง€๋งŒ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ๋“ค์ด ์—†์œผ๋ฏ€๋กœ, ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฌด์‹œ๋œ๋‹ค.) 

"๊ฐœ์ธ ์ƒ๊ฐ : ํ—ค๋“œ๋ฅผ ํ—ค๋“œ์ƒท์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋” ์‰ฌ์šด๋“ฏ"

 

<์™„์„ฑ ์ฝ”๋“œ>

interface Stack {
  readonly size: number;
  push(value: string): void;
  pop(): string;
}

type StackNode = {
  readonly value: string;
  readonly next?: StackNode;
};

class StackImpl implements Stack {
  private _size: number = 0;
  //head๋Š” StackNode๋ฅผ ๋ฐ”๋ผ๋ณผ ์ˆ˜๋„, ์•ˆ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ์Œ(StackNode|undefined ๋กœ ์“ฐ๋Š” ๋Œ€์‹ , optional๋กœ ์ง€์ •)
  private head?: StackNode;

  constructor(private capacity: number) {}

  get size() {
    return this._size;
  }

  push(value: string): void {
    if (this.size === this.capacity) {
      throw new Error("Stack is Full!!");
    }
    //node๋Š” StackNode(์‚ฌ์šฉ์ž ์ง€์ • ๋…ธ๋“œ)๋ผ๋Š” ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๋”ฐ๋ผ๊ฐ€๋Š” ๋…ธ๋“œ๋กœ,
    //value๋ผ๋Š” ํ‚ค์— ์ „๋‹ฌ๋ฐ›์€ value๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋ฐ ์ด๋ฆ„์ด ๋˜‘๊ฐ™์•„์„œ ๊ตณ์ด value:value๋ผ๊ณ  ์“ธ  ํ•„์š”์—†์ด value๋ผ๊ณ ๋งŒ ์ž‘์„ฑ
    //next๋Š” head๊ฐ€ ๊ธฐ์กด์— ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋ฉด ๋จ!!!
    const node: StackNode = { value, next: this.head };
    //node๋Š” ์ƒˆ๋กœ ๋“ค์–ด์˜จ ์•„์ด์ด๊ณ , head๋Š” ๋‹ค์‹œ ์ƒˆ๋กœ๋“ค์–ด์˜จ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•œ๋‹ค.
    this.head = node;
    this._size++;
  }
  pop(): string {
    if (this.head == null) {
      throw new Error("Stack is empty!");
    }
    const node = this.head;
    this.head = node.next;
    this._size--;
    return node.value;
  }
}

const stack = new StackImpl(10);
console.log(stack);
stack.push("๋–ก๋ณถ์ด");
console.log(stack);
stack.push("์ˆœ๋Œ€");
console.log(stack);
stack.push("ํ”ผ์ž");
console.log(stack);
stack.push("๋ผ๋ฉด");
console.log(stack);
console.log(stack.pop());

console.log(stack);

console.log("์Šคํƒ์„ ๋น„์›Œ๋ด…์‹œ๋‹ค!");
while (stack.size != 0) {
  console.log(stack.pop());
}
console.log(stack.pop());

<์ถœ๋ ฅ ๊ฒฐ๊ณผ>

StackImpl { capacity: 10, _size: 0 }
StackImpl {
  capacity: 10,
  _size: 1,
  head: { value: '๋–ก๋ณถ์ด', next: undefined }
}
StackImpl {
  capacity: 10,
  _size: 2,
  head: { value: '์ˆœ๋Œ€', next: { value: '๋–ก๋ณถ์ด', next: undefined } }
}
StackImpl {
  capacity: 10,
  _size: 3,
  head: { value: 'ํ”ผ์ž', next: { value: '์ˆœ๋Œ€', next: [Object] } }
}
StackImpl {
  capacity: 10,
  _size: 4,
  head: { value: '๋ผ๋ฉด', next: { value: 'ํ”ผ์ž', next: [Object] } }
}
๋ผ๋ฉด
StackImpl {
  capacity: 10,
  _size: 3,
  head: { value: 'ํ”ผ์ž', next: { value: '์ˆœ๋Œ€', next: [Object] } }
}
์Šคํƒ์„ ๋น„์›Œ๋ด…์‹œ๋‹ค!
ํ”ผ์ž
์ˆœ๋Œ€
๋–ก๋ณถ์ด
/Users/์œ ์ €์ด๋ฆ„/Desktop/ํ”„์ ์ด๋ฆ„/dist/index.js:29
            throw new Error("Stack is empty!");
            ^

Error: Stack is empty!

 

<์ฝ”๋“œ ํŒŒ์•…>

1. ๋ฉค๋ฒ„๋ณ€์ˆ˜ size๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜์ด๋ฏ€๋กœ, readonlyํ•˜๊ฒŒ

๋ฉค๋ฒ„ ๋ณ€์ˆ˜ size๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ์ด๋‹ˆ๊นŒ, ์ ‘๊ทผ์ œํ•œ์ง€์ •์ž private๋กœ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๊ณ 

๋‚ด๋ถ€ ๋ณ€์ˆ˜๋ผ๋Š” ๋œป์œผ๋กœ _size๋กœ ์ž‘์„ฑํ•œ ๋‹ค์Œ,

getter ์ด์šฉํ•ด์„œ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ๊ฐ€๋Šฅ๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์—ด์–ด์ค€๋‹ค.

(setter๊ฐ€ ์—†์œผ๋‹ˆ๊นŒ ์˜ค๋กœ์ง€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅ!)

interface Stack {
  readonly size: number;
  push(value: string): void;
  pop(): string;
}

class StackImpl implements Stack {
  private _size: number = 0;
  get size() {
    return this._size;
  }

 

2.  pushํ•˜๋ฉด _size++, popํ•˜๋ฉด _size--;

interface Stack {
  readonly size: number;
  push(value: string): void;
  pop(): string;
}

class StackImpl implements Stack {
  private _size: number = 0;

  get size() {
    return this._size;
  }

  push(value: string): void {
    this._size++;
  }
  pop(): string {
    this._size--;
  }
}

3. ์•„์ดํ…œ์„ ๊ฐ์Œ€ ๋…ธ๋“œ๋ฅผ typeํ™” ๋ณธ๊ฒฉ์ ์ธ push, pop ๊ตฌํ˜„

์ถ”๊ฐ€๋˜๋Š” ๊ฐ ์•„์ดํ…œ๋“ค์„ ๋…ธ๋“œ๋กœ ๊ฐ์‹ผ ๋’ค, head๊ฐ€ ์ด ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฉ์‹์„ ์ทจํ•˜๋„๋ก ํ•œ๋‹ค.

์•„์ดํ…œ์„ ๊ฐ์Œ€ ๋…ธ๋“œ๋ฅผ type์œผ๋กœ ์ง€์ •ํ•ด์ค€๋‹ค.

๋˜ํ•œ, ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ(์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์—ˆ๊ณ , ๊ทธ๊ฒƒ์„ ํ•œ๋‹จ๊ณ„ ๊ฐ์‹ธ๋Š” ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋ฅ˜)๋ฅผ ์ •์˜ํ•  ๋•Œ, ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ „๋‹ฌ๋œ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๋‚ด์šฉ๋ฌผ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก readonly ํ‚ค์›Œ๋“œ๋ฅผ ๋‹ฌ์•„์ฃผ์ž.

type StackNode = {
  readonly value: string;
  readonly next?: StackNode;
};

 

4. ๋ณธ๊ฒฉ์ ์ธ push

์ƒˆ๋กœ์šด ๊ฐ’์ด ๋“ค์–ด์˜จ๋‹ค๋ฉด node๋กœ ๊ฐ์‹ธ๊ณ , ์ด node๋Š” head๊ฐ€ ๊ธฐ์กด์— ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค.(์•„๋ž˜ ๊ทธ๋ฆผ)

์ถ”๊ฐ€๋กœ head๋ฅผ ์ƒˆ๋กœ ๋“ค์–ด์˜จ node๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•œ๋‹ค. (๊ทธ๋Ÿฌ๋ฉด head๊ฐ€ ๊ธฐ์กด์— ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋˜ ๋ฐฉ์‹์˜ ํฌ์ธํ„ฐ๋Š” ์ž๋™ ํ•ด์ œ๋จ)

๋จผ์ €, ์ƒˆ๋กœ์šด value๊ฐ€ ๋“ค์–ด ์˜ค๋ฉด ์ด value๋ฅผ ๊ฐ์‹ธ๋Š” ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

interface Stack {
  readonly size: number;
  push(value: string): void;
  pop(): string;
}

type StackNode = {
  readonly value: string;
  readonly next?: StackNode;
};

class StackImpl implements Stack {
  private _size: number = 0;
  //head๋Š” StackNode๋ฅผ ๋ฐ”๋ผ๋ณผ ์ˆ˜๋„, ์•ˆ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ์Œ(StackNode|undefined ๋กœ ์“ฐ๋Š” ๋Œ€์‹ , optional๋กœ ์ง€์ •)
  private head?: StackNode;

  get size() {
    return this._size;
  }

  push(value: string): void {
    //node๋Š” StackNode(์‚ฌ์šฉ์ž ์ง€์ • ๋…ธ๋“œ)๋ผ๋Š” ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๋”ฐ๋ผ๊ฐ€๋Š” ๋…ธ๋“œ๋กœ,
    //value๋ผ๋Š” ํ‚ค์— ์ „๋‹ฌ๋ฐ›์€ value๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋ฐ ์ด๋ฆ„์ด ๋˜‘๊ฐ™์•„์„œ ๊ตณ์ด value:value๋ผ๊ณ  ์“ธ ํ•„์š”์—†์ด value๋ผ๊ณ ๋งŒ ์ž‘์„ฑ
    //next๋Š” head๊ฐ€ ๊ธฐ์กด์— ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋ฉด ๋จ!!!
    const node: StackNode = { value, next: this.head };
    //node๋Š” ์ƒˆ๋กœ ๋“ค์–ด์˜จ ์•„์ด์ด๊ณ , head๋Š” ๋‹ค์‹œ ์ƒˆ๋กœ๋“ค์–ด์˜จ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•œ๋‹ค.
    this.head = node;
    this._size++;
  }

4. ๋ณธ๊ฒฉ์ ์ธ pop ๊ตฌํ˜„

- pop์€ head๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋˜ ๋…ธ๋“œ์˜ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—ฐ๊ฒฐ ํ•ด์ง€๋˜๊ฒŒ๋”

(head๋Š” ๋‹ค์‹œ ์ด์ „ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๋„๋ก ํ•จ์œผ๋กœ์จ ๊ฐ€๋Šฅ) 

  pop(): string {
    //ํ—ค๋“œ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋˜ ๋…ธ๋“œ์˜ value๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๊ธฐ ์œ„ํ•œ ๊ธฐ์ดˆ์ž‘์—…(1)
    const node = this.head;
    //head๊ฐ€ ๋‹ค์‹œ ์ด์ „ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๋„๋ก ์ง€์ •(์‚ฌ์‹ค์ƒ ์—ฌ๊ธฐ์„œ ์—ฐ๊ฒฐ๋Š๊น€)
    this.head = node.next;
    //์Šคํƒ ์‚ฌ์ด์ฆˆ ์ค„์—ฌ์ฃผ๊ธฐ
    this._size--;
    //ํ—ค๋“œ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋˜ ๋…ธ๋“œ์˜ value๋ฅผ ๋ฆฌํ„ด(pop๋˜๊ณ  ์ด์ œ ์‚ฌ์‹ค์ƒ ๋ฌด์‹œ๋จ)
    return node.value;
  }
}

- ์Šคํƒ์— ์•„๋ฌด ๊ฒƒ๋„ ์—†์„ ๋•Œ pop์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—๋Ÿฌ ๋˜์ ธ์ฃผ๊ธฐ

  pop(): string {
    //์Šคํƒ์ด ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ์— node๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.
    //๊ทธ๋Ÿฌ๋‚˜ API ์ž์ฒด์—์„œ string | undefined๋ฅผ ํ•ด์ฃผ๋ฉด ๋“ค์–ด๊ฐˆ ๋–„ ๋งˆ๋‹ค null check๋ฅผ ํ•˜๊ฒŒ๋˜์„œ ๋ณ„๋กœ๊ณ ,(๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๋งค๋ฒˆ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๊ผด)
    //ํ•ญ์ƒ ์žˆ๊ณ , ๋ฆฌํ„ดํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด์žˆ๋‹ค๊ณ  ์ง€์ •ํ•˜๋Š” ๋Œ€์‹ ์— ์•„๋ž˜ if๋ฌธ ์ž‘์„ฑ
    // null == undefined, null !== undefined
    if (this.head == null) {
      throw new Error("Stack is empty!");
    }
    //ํ—ค๋“œ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋˜ ๋…ธ๋“œ์˜ value๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๊ธฐ ์œ„ํ•œ ๊ธฐ์ดˆ์ž‘์—…(1)
    const node = this.head;
    //head๊ฐ€ ๋‹ค์‹œ ์ด์ „ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๋„๋ก ์ง€์ •(์‚ฌ์‹ค์ƒ ์—ฌ๊ธฐ์„œ ์—ฐ๊ฒฐ๋Š๊น€)
    this.head = node.next;
    //์Šคํƒ ์‚ฌ์ด์ฆˆ ์ค„์—ฌ์ฃผ๊ธฐ
    this._size--;
    //ํ—ค๋“œ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋˜ ๋…ธ๋“œ์˜ value๋ฅผ ๋ฆฌํ„ด(pop๋˜๊ณ  ์ด์ œ ์‚ฌ์‹ค์ƒ ๋ฌด์‹œ๋จ)
    return node.value;
  }

5. ์ƒ์„ฑํ•  ๋•Œ size ๋ฒ”์œ„๋ฅผ ์ •ํ•ด์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด... 

๋ณดํ†ต์€ constructor์—์„œ ์–ผ๋งˆ๋งŒํผ์˜ ์šฉ๋Ÿ‰(์Šคํƒ์˜ ์‚ฌ์ด์ฆˆ)์œผ๋กœ ํ•  ๊ฑด์ง€ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ๋” ๋งŒ๋“ ๋‹ค.

 
  constructor(private capacity: number) {}

์ด ์ •ํ•ด์ง„ ์‚ฌ์ด์ฆˆ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ push ํ•จ์ˆ˜์— ๋กœ์ง์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

  push(value: string): void {
    //์ง€๊ธˆ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ •ํ•ด์ง„ ์šฉ๋Ÿ‰๊ณผ ๋˜‘๊ฐ™๋‹ค๋ฉด(๊ฝ‰ ์ฐฌ ์ƒํƒœ๋ผ๋ฉด ใ… ใ… )
    if (this.size === this.capacity) {
      throw new Error("Stack is Full!!");
    }
    //node๋Š” StackNode(์‚ฌ์šฉ์ž ์ง€์ • ๋…ธ๋“œ)๋ผ๋Š” ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๋”ฐ๋ผ๊ฐ€๋Š” ๋…ธ๋“œ๋กœ,
    //value๋ผ๋Š” ํ‚ค์— ์ „๋‹ฌ๋ฐ›์€ value๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋ฐ ์ด๋ฆ„์ด ๋˜‘๊ฐ™์•„์„œ ๊ตณ์ด value:value๋ผ๊ณ  ์“ธ  ํ•„์š”์—†์ด value๋ผ๊ณ ๋งŒ ์ž‘์„ฑ
    //next๋Š” head๊ฐ€ ๊ธฐ์กด์— ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋ฉด ๋จ!!!
    const node: StackNode = { value, next: this.head };
    //node๋Š” ์ƒˆ๋กœ ๋“ค์–ด์˜จ ์•„์ด์ด๊ณ , head๋Š” ๋‹ค์‹œ ์ƒˆ๋กœ๋“ค์–ด์˜จ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•œ๋‹ค.
    this.head = node;
    this._size++;
  }

 

6. ์ตœ์ข… ์ฝ”๋“œ


interface Stack {
  readonly size: number;
  push(value: string): void;
  pop(): string;
}

type StackNode = {
  readonly value: string;
  readonly next?: StackNode;
};

class StackImpl implements Stack {
  private _size: number = 0;
  //head๋Š” StackNode๋ฅผ ๋ฐ”๋ผ๋ณผ ์ˆ˜๋„, ์•ˆ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ์Œ(StackNode|undefined ๋กœ ์“ฐ๋Š” ๋Œ€์‹ , optional๋กœ ์ง€์ •)
  private head?: StackNode;

  constructor(private capacity: number) {}

  get size() {
    return this._size;
  }

  push(value: string): void {
    //์ง€๊ธˆ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ •ํ•ด์ง„ ์šฉ๋Ÿ‰๊ณผ ๋˜‘๊ฐ™๋‹ค๋ฉด(๊ฝ‰ ์ฐฌ ์ƒํƒœ๋ผ๋ฉด ใ… ใ… )
    if (this.size === this.capacity) {
      throw new Error("Stack is Full!!");
    }
    //node๋Š” StackNode(์‚ฌ์šฉ์ž ์ง€์ • ๋…ธ๋“œ)๋ผ๋Š” ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๋”ฐ๋ผ๊ฐ€๋Š” ๋…ธ๋“œ๋กœ,
    //value๋ผ๋Š” ํ‚ค์— ์ „๋‹ฌ๋ฐ›์€ value๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋ฐ ์ด๋ฆ„์ด ๋˜‘๊ฐ™์•„์„œ ๊ตณ์ด value:value๋ผ๊ณ  ์“ธ  ํ•„์š”์—†์ด value๋ผ๊ณ ๋งŒ ์ž‘์„ฑ
    //next๋Š” head๊ฐ€ ๊ธฐ์กด์— ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋ฉด ๋จ!!!
    const node: StackNode = { value, next: this.head };
    //node๋Š” ์ƒˆ๋กœ ๋“ค์–ด์˜จ ์•„์ด์ด๊ณ , head๋Š” ๋‹ค์‹œ ์ƒˆ๋กœ๋“ค์–ด์˜จ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•œ๋‹ค.
    this.head = node;
    this._size++;
  }
  pop(): string {
    //์Šคํƒ์ด ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ์— node๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.
    //๊ทธ๋Ÿฌ๋‚˜ API ์ž์ฒด์—์„œ string | undefined๋ฅผ ํ•ด์ฃผ๋ฉด ๋“ค์–ด๊ฐˆ ๋–„ ๋งˆ๋‹ค null check๋ฅผ ํ•˜๊ฒŒ๋˜์„œ ๋ณ„๋กœ๊ณ ,(๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๋งค๋ฒˆ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๊ผด)
    //ํ•ญ์ƒ ์žˆ๊ณ , ๋ฆฌํ„ดํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด์žˆ๋‹ค๊ณ  ์ง€์ •ํ•˜๋Š” ๋Œ€์‹ ์— ์•„๋ž˜ if๋ฌธ ์ž‘์„ฑ
    // null == undefined, null !== undefined
    if (this.head == null) {
      throw new Error("Stack is empty!");
    }
    //ํ—ค๋“œ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋˜ ๋…ธ๋“œ์˜ value๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๊ธฐ ์œ„ํ•œ ๊ธฐ์ดˆ์ž‘์—…(1)
    const node = this.head;
    //head๊ฐ€ ๋‹ค์‹œ ์ด์ „ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๋„๋ก ์ง€์ •(์‚ฌ์‹ค์ƒ ์—ฌ๊ธฐ์„œ ์—ฐ๊ฒฐ๋Š๊น€)
    this.head = node.next;
    //์Šคํƒ ์‚ฌ์ด์ฆˆ ์ค„์—ฌ์ฃผ๊ธฐ
    this._size--;
    //ํ—ค๋“œ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋˜ ๋…ธ๋“œ์˜ value๋ฅผ ๋ฆฌํ„ด(pop๋˜๊ณ  ์ด์ œ ์‚ฌ์‹ค์ƒ ๋ฌด์‹œ๋จ)
    return node.value;
  }
}

const stack = new StackImpl(10);
console.log(stack);
stack.push("๋–ก๋ณถ์ด");
console.log(stack);
stack.push("์ˆœ๋Œ€");
console.log(stack);
stack.push("ํ”ผ์ž");
console.log(stack);
stack.push("๋ผ๋ฉด");
console.log(stack);
console.log(stack.pop());

console.log(stack);

console.log("์Šคํƒ์„ ๋น„์›Œ๋ด…์‹œ๋‹ค!");
while (stack.size != 0) {
  console.log(stack.pop());
}
console.log(stack.pop());

์ถœ๋ ฅ๊ฒฐ๊ณผ

StackImpl { capacity: 10, _size: 0 }
StackImpl {
  capacity: 10,
  _size: 1,
  head: { value: '๋–ก๋ณถ์ด', next: undefined }
}
StackImpl {
  capacity: 10,
  _size: 2,
  head: { value: '์ˆœ๋Œ€', next: { value: '๋–ก๋ณถ์ด', next: undefined } }
}
StackImpl {
  capacity: 10,
  _size: 3,
  head: { value: 'ํ”ผ์ž', next: { value: '์ˆœ๋Œ€', next: [Object] } }
}
StackImpl {
  capacity: 10,
  _size: 4,
  head: { value: '๋ผ๋ฉด', next: { value: 'ํ”ผ์ž', next: [Object] } }
}
๋ผ๋ฉด
StackImpl {
  capacity: 10,
  _size: 3,
  head: { value: 'ํ”ผ์ž', next: { value: '์ˆœ๋Œ€', next: [Object] } }
}
์Šคํƒ์„ ๋น„์›Œ๋ด…์‹œ๋‹ค!
ํ”ผ์ž
์ˆœ๋Œ€
๋–ก๋ณถ์ด
/Users/007/Desktop/tr/dist/index.js:34
            throw new Error("Stack is empty!");
            ^

Error: Stack is empty!

 

7. ์Šคํƒ ์šฉ๋Ÿ‰์„ ์ œํ•œํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด



interface Stack {
  readonly size: number;
  push(value: string): void;
  pop(): string;
}

type StackNode = {
  readonly value: string;
  readonly next?: StackNode;
};

class StackImpl implements Stack {
  private _size: number = 0;
  //head๋Š” StackNode๋ฅผ ๋ฐ”๋ผ๋ณผ ์ˆ˜๋„, ์•ˆ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ์Œ(StackNode|undefined ๋กœ ์“ฐ๋Š” ๋Œ€์‹ , optional๋กœ ์ง€์ •)
  private head?: StackNode;

  constructor(private capacity?: number) {}

  get size() {
    return this._size;
  }

  push(value: string): void {
    //์ง€๊ธˆ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ •ํ•ด์ง„ ์šฉ๋Ÿ‰๊ณผ ๋˜‘๊ฐ™๋‹ค๋ฉด(๊ฝ‰ ์ฐฌ ์ƒํƒœ๋ผ๋ฉด ใ… ใ… )
    if (this.capacity !== undefined) {
      if (this.size === this.capacity) {
        throw new Error("Stack is Full!!");
      }
    }
    //node๋Š” StackNode(์‚ฌ์šฉ์ž ์ง€์ • ๋…ธ๋“œ)๋ผ๋Š” ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๋”ฐ๋ผ๊ฐ€๋Š” ๋…ธ๋“œ๋กœ,
    //value๋ผ๋Š” ํ‚ค์— ์ „๋‹ฌ๋ฐ›์€ value๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋ฐ ์ด๋ฆ„์ด ๋˜‘๊ฐ™์•„์„œ ๊ตณ์ด value:value๋ผ๊ณ  ์“ธ  ํ•„์š”์—†์ด value๋ผ๊ณ ๋งŒ ์ž‘์„ฑ
    //next๋Š” head๊ฐ€ ๊ธฐ์กด์— ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋ฉด ๋จ!!!
    const node: StackNode = { value, next: this.head };
    //node๋Š” ์ƒˆ๋กœ ๋“ค์–ด์˜จ ์•„์ด์ด๊ณ , head๋Š” ๋‹ค์‹œ ์ƒˆ๋กœ๋“ค์–ด์˜จ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•œ๋‹ค.
    this.head = node;
    this._size++;
  }
  pop(): string {
    //์Šคํƒ์ด ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ์— node๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.
    //๊ทธ๋Ÿฌ๋‚˜ API ์ž์ฒด์—์„œ string | undefined๋ฅผ ํ•ด์ฃผ๋ฉด ๋“ค์–ด๊ฐˆ ๋–„ ๋งˆ๋‹ค null check๋ฅผ ํ•˜๊ฒŒ๋˜์„œ ๋ณ„๋กœ๊ณ ,(๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๋งค๋ฒˆ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๊ผด)
    //ํ•ญ์ƒ ์žˆ๊ณ , ๋ฆฌํ„ดํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด์žˆ๋‹ค๊ณ  ์ง€์ •ํ•˜๋Š” ๋Œ€์‹ ์— ์•„๋ž˜ if๋ฌธ ์ž‘์„ฑ
    // null == undefined, null !== undefined
    if (this.head == null) {
      throw new Error("Stack is empty!");
    }
    //ํ—ค๋“œ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋˜ ๋…ธ๋“œ์˜ value๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๊ธฐ ์œ„ํ•œ ๊ธฐ์ดˆ์ž‘์—…(1)
    const node = this.head;
    //head๊ฐ€ ๋‹ค์‹œ ์ด์ „ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๋„๋ก ์ง€์ •(์‚ฌ์‹ค์ƒ ์—ฌ๊ธฐ์„œ ์—ฐ๊ฒฐ๋Š๊น€)
    this.head = node.next;
    //์Šคํƒ ์‚ฌ์ด์ฆˆ ์ค„์—ฌ์ฃผ๊ธฐ
    this._size--;
    //ํ—ค๋“œ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋˜ ๋…ธ๋“œ์˜ value๋ฅผ ๋ฆฌํ„ด(pop๋˜๊ณ  ์ด์ œ ์‚ฌ์‹ค์ƒ ๋ฌด์‹œ๋จ)
    return node.value;
  }
}

const stack = new StackImpl();
console.log(stack);
stack.push("๋–ก๋ณถ์ด");
console.log(stack);
stack.push("์ˆœ๋Œ€");
console.log(stack);
stack.push("ํ”ผ์ž");
console.log(stack);
stack.push("๋ผ๋ฉด");
console.log(stack);
console.log(stack.pop());

console.log(stack);

console.log("์Šคํƒ์„ ๋น„์›Œ๋ด…์‹œ๋‹ค!");
while (stack.size != 0) {
  console.log(stack.pop());
}
console.log(stack.pop());

<์ถœ๋ ฅ ๊ฒฐ๊ณผ>

StackImpl { capacity: undefined, _size: 0 }
StackImpl {
  capacity: undefined,
  _size: 1,
  head: { value: '๋–ก๋ณถ์ด', next: undefined }
}
StackImpl {
  capacity: undefined,
  _size: 2,
  head: { value: '์ˆœ๋Œ€', next: { value: '๋–ก๋ณถ์ด', next: undefined } }
}
StackImpl {
  capacity: undefined,
  _size: 3,
  head: { value: 'ํ”ผ์ž', next: { value: '์ˆœ๋Œ€', next: [Object] } }
}
StackImpl {
  capacity: undefined,
  _size: 4,
  head: { value: '๋ผ๋ฉด', next: { value: 'ํ”ผ์ž', next: [Object] } }
}
๋ผ๋ฉด
StackImpl {
  capacity: undefined,
  _size: 3,
  head: { value: 'ํ”ผ์ž', next: { value: '์ˆœ๋Œ€', next: [Object] } }
}
์Šคํƒ์„ ๋น„์›Œ๋ด…์‹œ๋‹ค!
ํ”ผ์ž
์ˆœ๋Œ€
๋–ก๋ณถ์ด
/Users/007/Desktop/tr/dist/index.js:36
            throw new Error("Stack is empty!");
            ^

Error: Stack is empty!

 

 

 

 

728x90

'TypeScript > ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ TypeScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ Generic Stack<T> ํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๊ธฐ  (0) 2022.04.25
[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ์ œ๋„ค๋ฆญ  (0) 2022.04.25
[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] Abstract ํด๋ž˜์Šค์™€ abstract method  (0) 2022.04.23
[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] composition ์žฅ์ ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ interface  (0) 2022.04.23
[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ฝƒ composition(๋ถ€์ œ: ์ƒ์†์˜ ๋ฌธ์ œ์ )  (0) 2022.04.22
    'TypeScript/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ TypeScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ Generic Stack<T> ํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๊ธฐ
    • [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ์ œ๋„ค๋ฆญ
    • [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] Abstract ํด๋ž˜์Šค์™€ abstract method
    • [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] composition ์žฅ์ ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ interface
    Rainbow๐ŸŒˆCoder
    Rainbow๐ŸŒˆCoder
    ๋ชฐ๋ผ๋„ ๊ฒฐ๊ตญ์€ ์•„๋Š” ๊ฐœ๋ฐœ์ž, ๊ทธ๋Ÿฐ ์‚ฌ๋žŒ์ด ๋˜๊ธฐ ์œ„ํ•œ ๋งค์ผ์˜ ํ•œ๊ฑธ์Œ

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”