data structure

๐Ÿ—‚๏ธ ์ž๋ฃŒ๊ตฌ์กฐ ๊ณต๋ถ€ํ•˜๊ธฐ 2 | ์Šคํƒ(stack) vs ํ(queue)

grasinnong 2020. 12. 18. 13:50

 

 

 

์Šคํƒ(stack) 

unsplash

 

์ด๋ ‡๊ฒŒ ์ฑ…์ด ๋ฌด๋”๊ธฐ๋กœ ์Œ“์—ฌ์žˆ์„ ๋•Œ, ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์Œ“์€ ์ฑ…์„ ๊ฐ€์žฅ ๋จผ์ € ๊บผ๋‚ธ ํ›„์— ๋‹ค๋ฅธ ์ฑ…์„ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 

 

์Šคํƒ์€ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋“ค์–ด์˜จ ๊ฒƒ์ด ๊ฐ€์žฅ ๋จผ์ € ๋‚˜๊ฐ€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค(LIFO : Last In, First Out).

 

๋’ค๋กœ๊ฐ€๊ธฐ, ๊ณ„์‚ฐ๊ธฐ ๋“ฑ๋„ ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ์˜ˆ์ด๋‹ค. 

 

์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ

stack์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ๋กœ๋Š” push, pop, top/peek ๋“ฑ์ด ์žˆ๋‹ค.

1. push : ์Šคํƒ๊ณต๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘์–ด๋„ฃ๋Š”(์ €์žฅํ•˜๋Š”) ๋ฉ”์„œ๋“œ์ด๋‹ค. 

2. pop : ์Šคํƒ๊ณต๊ฐ„์˜ ์ตœ์ƒ๋‹จ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. 

3. peek : ์ œ์ผ ์ตœ๊ทผ์— ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ, ์ตœ์ƒ์œ„ ๋ฐ์ดํ„ฐ(top)๋ฅผ ์ฝ๋Š” ์ž‘์—…์ด๋‹ค. (๋ฐ์ดํ„ฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค)

 

 

์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด๋ณด๊ธฐ 

class Stack{
  constructor(){
  //๊ฐ€์žฅ ์ตœ์ƒ๋‹จ์˜ ์ธ๋ฑ์Šค ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” this.top
  //๊ฐ’๋“ค์ด ์ €์žฅ๋  this.storage = {};
  }
  
  push(element){
  //์กฐ๊ฑด๋ฌธ์œผ๋กœ this.storage์— this.top์˜ ๊ฐ’์ด ์žˆ์„ ๋•Œ, this.top์˜ ๊ฐ’์ด ์—†์„ ๋•Œ๋กœ ๋ถ„๊ธฐํ•ด์ค€๋‹ค.
  //์žˆ๋‹ค๋ฉด this.top ++
  //element๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. 
  }
  
  pop(){
  //this.storage์— ์›์†Œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ์„ ์‹œ์—๋งŒ pop์ด ์‹คํ–‰๋˜๋„๋ก ๋ถ„๊ธฐํ•ด์ค€๋‹ค.
  //์‚ญ์ œ๋  ๊ฐ’์„ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.
  //๊ฐ’์„ ์‚ญ์ œํ•œ๋‹ค.
  //this.top์ด 0์ด ์•„๋‹ˆ๋ผ๋ฉด this.top --
  //์‚ญ์ œ๋œ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค. 
  }
  
  size(){
  //this.storage์— ์›์†Œ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์žˆ๋‹ค๋ฉด return this.top + 1 , ์—†๋‹ค๋ฉด 0์„ ๋ฆฌํ„ดํ•ด์ค€๋‹ค. 
  }
}

 

 

 

 

ํ(queue) 

 

 

ํ”„๋ฆฐํ„ฐ๋กœ ์ธ์‡„ํ•  ๋•Œ ๋Œ€๊ธฐ์—ด์€ ์ธ์‡„๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์˜จ๋‹ค.

๋†€์ด๊ณต์›์— ์ค„์„ ์„ฐ์„ ๋•Œ, ๊ฐ€์žฅ ์•ž์— ์‚ฌ๋žŒ์ด ๊ฐ€์žฅ ๋จผ์ € ๋†€์ด๊ธฐ๊ตฌ๋ฅผ ํƒ€๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ๋ผ๊ณ  ํ•œ๋‹ค. 

 

ํ๋Š” ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด์˜จ ๊ฒƒ์ด ๊ฐ€์žฅ ๋จผ์ € ๋‚˜๊ฐ€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. (FIFO : First In, First Out)

 

 

๋Œ€๋ถ€๋ถ„์˜ ์ž…์ถœ๋ ฅ์ด ํ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค.

 

 

์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ

ํ์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฉ”์„œ๋“œ๋กœ๋Š” enqueue, dequeue ๋“ฑ์ด ์žˆ๋‹ค. 

1. enqueue : ํ์— ๊ฐ’์„ ์ง‘์–ด๋„ฃ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. 

2. dequeue : ํ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด๊ฐ„ ๊ฐ’์„ ๋นผ๋‚ด๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. 

3. ๊ทธ ์™ธ์— size๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ, ํ๊ฐ€ ๋น„์–ด์žˆ๋Š” ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ์ธ empty ๋“ฑ์ด ์žˆ๋‹ค. 

 

 

ํ ์ž๋ฃŒ๊ตฌ์กฐ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด๋ณด๊ธฐ 

class Queue{
  constructor(){
    // ๊ฐ’๋“ค์„ ์ €์žฅํ•  this.storage = {}
    // ์ฒซ๋ฒˆ์งธ ์ธ๋ฑ์Šค ๊ฐ’ this.first
    // ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค ๊ฐ’ this.top
  }
  
  enqueue(element){
  //this.top์ด this.storage์— ์žˆ์„ ๋•Œ๋Š” this.top++
  // this.first์˜ ๊ฐ’์ด this.top๋ณด๋‹ค ํด ๋•Œ๋Š” this.storage[this.first] ์˜ ๊ฐ’์œผ๋กœ element๋ฅผ
  //๋„ฃ์–ด์ฃผ๊ณ , 
  //์•„๋‹ˆ๋ผ๋ฉด this.storage์˜ this.top์œผ๋กœ element๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. 
  }
  
  dequeue(){
  //์‚ญ์ œ๋  ๊ฐ’์ด ์žˆ๋‹ค๋ฉด 
  //์‚ญ์ œ๋  ๊ฐ’์„ ๋ณ€์ˆ˜์— ๋‹ด๊ณ 
  //๊ฐ’์„ ์‚ญ์ œํ•œ๋‹ค.
  //this.first์˜ ๊ฐ’์„ ++
  //์‚ญ์ œ๋œ ๊ฐ’์„ return ํ•œ๋‹ค. 
  }
  
  size(){
    // this.top์ด 0์ด ์•„๋‹ ๊ฒฝ์šฐ๋Š” 
    //this.top๊ณผ this.first์˜ ์ฐจ๋ฅผ ๊ตฌํ•˜๊ณ  + 1์„ ํ•ด์„œ return ํ•œ๋‹ค. (0์ด๋ฉด this.top)
  }
  
}

 

 

 

 

์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ƒํ™ฉ์—์„œ ์ƒํ™ฉ์— ๋งž๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค. ์Šคํƒ๊ณผ ํ๋Š” ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋“ค์€ ์ฝ”๋“œ๋กœ ์ •์˜๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํ•˜๋‚˜์˜ ๊ทœ์น™์ด๋‹ค. 

 

๋‚ด๊ฐ€ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ ๋’ค๋กœ๊ฐ€๊ธฐ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ทธ ๋•Œ ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋– ์˜ฌ๋ฆฌ๊ณ  ๊ทธ ๊ทœ์น™์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ๋œ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[์ฐธ๊ณ ์ž๋ฃŒ]