Stack
๋ฐ์ดํฐ๋ฅผ ์์์ฌ๋ฆฌ๋ ์ ํ ์๋ฃ๊ตฌ์กฐ
ํ๋ฒ ๋ง์์์ผ๋ก ์์๋ฅผ ์์์ฌ๋ ค๋ณด์. ์์์ฌ๋ฆฐ ์์ ์ค ํ๋๋ฅผ ๊บผ๋ด์ผํ ๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ๋จผ์ ๊บผ๋ผ ์ ์๋ ์์๋ ๋ฌด์์ผ๊น?
์ด๋ค ์์๋ฅผ ๊บผ๋ด๋๋ผ๋ ์ฐ๋ฆฌ๋ ๊ฐ์ฅ ์์ ์๋ ์์๋ถํฐ ๊บผ๋ด์ผํ๋ค.
stack๋ ์์๋ฅผ ์๋ ๊ณผ์ ๊ณผ ๊ฐ๋ค. ๋ฐ์ดํฐ๋ฅผ ์์์ฌ๋ฆฌ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ฏ๋ก stack์ ๋ฐ์ดํฐ๋ฅผ ์์ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ๋จผ์ ๊บผ๋ผ ์ ์๋ ๋ฐ์ดํฐ๋ ๊ฐ์ฅ ๋ง์ง๋ง์ ์์์ฌ๋ฆฐ ๋ฐ์ดํฐ, ์ฆ ๊ฐ์ฅ ๋ง์ง๋ง์ ์ง์ด ๋ฃ์ ๋ฐ์ดํฐ์ด๋ค.
Stack์ ํฐ ํน์ง์ ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ด ํ๋์ ๋ฐฉํฅ์ผ๋ก ์ด๋ฃจ์ด์ง๋ ์ ํ์ ์ ๊ทผ์ ์๋ค.
์ด๋ฐ ์คํ์ ๊ตฌ์กฐ๋ฅผ LIFO (Last In first Out; ํ์
์ ์ถ) ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์์
์ฐ๋ฆฌ๊ฐ ์์ฃผ ์ฌ์ฉํ๋ ๋ธ๋ผ์ฐ์ ์๋ Stack์ ์ฌ์ฉํ๊ณ ์๋ค. ๋ฐ๋ก ๋ธ๋ผ์ฐ์ ์ ๋ค๋ก ๊ฐ๊ธฐ, ์์ผ๋ก ๊ฐ๊ธฐ ๊ธฐ๋ฅ์ด๋ค.
prev stack์๋ ์ด์ ์ ๋ฐฉ๋ฌธํ ํ์ด์ง๋ฅผ stack์ ํตํด ์ ์ฅํ๋ค.
๋ค๋ก๊ฐ๊ธฐ๋ฅผ ๋๋ฅด๋ฉด prev stack์์ ๊ฐ์ฅ ์ต๊ทผ์ ์ ์ฅ๋ ํ์ด์ง๋ฅผ ๊บผ๋ด์ค๊ณ next stack์๋ ํ์ฌ ํ์ด์ง๋ฅผ ์ ์ฅํ๋ค.
์์ผ๋ก ๊ฐ๊ธฐ๋ฅผ ๋๋ฅด๋ฉด prev stack์์ ๊ฐ์ฅ ์ต๊ทผ์ ์ ์ฅ๋ ํ์ด์ง๋ฅผ ๊บผ๋ด์ค๊ณ ํ์ฌ ํ์ด์ง๋ฅผ prev stack์ ์ ์ฅํ๋ค.
์คํ์ ์ ํด์ง ๋ฐฉํฅ์ผ๋ก๋ง ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์๋ค.
top์ ๊ฐ์ฅ ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋๋ฐ top์ ํตํด์๋ง ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋๋ top์ด ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ์ ์์ ์ถ๊ฐ๋๋ค.
Stack์ ์ฐ์ฐ
push : ์์๋ฅผ ์ปฌ๋ ์
์ ์ถ๊ฐํ๋ค.
pop : ์์ง ์ ๊ฑฐ๋์ง ์์ ๊ฐ์ฅ ์ต๊ทผ์ ์ฝ์
๋ ์์๋ฅผ ์ถ์ถํ๋ค.
JavaScript๋ก ๊ตฌํํ๊ธฐ
class Stack {
constructor() {
this.storage = {};
this.length = 0;
}
push(element) {
this.storage[this.length++] = element;
}
pop() {
if (this.length > 0) {
let removed = this.storage[--this.length];
return removed;
}
}
size() {
return this.length;
}
empty() {
return (this.length ? 0 : 1);
}
top() {
return (this.length === 0 ? -1 : this.storage[this.length]);
}
}
JavaScript
๋ณต์ฌ
Queue
๋ฐ์ดํฐ๋ฅผ ์ง์ด๋ฃ์ ์ ์๋ ์ ํ ์๋ฃ๊ตฌ์กฐ
์ฐ๋ฆฌ๊ฐ ๋ง์ง์ ๋ค์ด๊ฐ๊ธฐ์ํด ์ค์ ์์๋ค๊ณ ์๊ฐํด๋ณด์. ์๋น์ ๊ฐ์ฅ ๋จผ์ ๋ค์ด๊ฐ ์ ์๋ ์ฌ๋์? ๋ฐ๋ก ๊ฐ์ฅ ๋จผ์ ์ค์ ์ ์ฌ๋์ผ ๊ฒ์ด๋ค.
Queue๋ ์ค๊ณผ ๊ฐ๋ค. Stack๊ณผ๋ ๋ฐ๋๋๋ ๊ฐ๋
์ผ๋ก, ๋ฐ์ดํฐ๋ฅผ ์ง์ด๋ฃ์ผ๋ฉด ๊ฐ์ฅ ๋จผ์ ๋ฃ์ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋จผ์ ๋์ค๊ฒ๋๋ค.
์ด๋ฐ ํ์ ๊ตฌ์กฐ๋ฅผ FIFO (First In First Out; ์ ์
์ ์ถ) ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์์
Queue๋ ๋ฐ์ดํฐ๊ฐ ์
๋ ฅ๋ ์์๋๋ก ์ฒ๋ฆฌํ ๋ ์ฃผ๋ก ์ฌ์ฉ
์ปดํจํฐ ์ฅ์น๋ค ์ฌ์ด์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋์๋ ๊ฐ ์ฅ์น ์ฌ์ด์ ์กด์ฌํ๋ ์๋, ์๊ฐ ์ฐจ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ์์ ๊ธฐ์ต ์ฅ์น buffer๋ฅผ Queue๋ฅผ ์ฌ์ฉํด ๊ตฌํ
์ ํ๋ธ์ ๊ฐ์ ๋์์ ์คํธ๋ฆฌ๋ฐ ์ฑ์ ํตํด ๋์์์ ์์ฒญํ ๋, ๋ค์ด๋ก๋ ๋ ๋ฐ์ดํฐ(data)๊ฐ ์์์ ์ฌ์ํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ, ๋์์์ ์ ์์ ์ผ๋ก ์ฌ์ํ๊ธฐ ์ํด Queue์ ๋ชจ์ ๋์๋ค๊ฐ ๋์์์ ์ฌ์ํ๊ธฐ์ ์ถฉ๋ถํ ์์ ๋ฐ์ดํฐ๊ฐ ๋ชจ์์ ๋ ๋์์์ ์ฌ์
queue๋ ํ ์ชฝ์์๋ ์ฝ์
, ๋ค๋ฅธ ํ ์ชฝ์์๋ ์ญ์ ์์
์ด ์ด๋ฃจ์ด์ง๋ค.
front๋ ์ญ์ ์ฐ์ฐ์ด ์ํ๋๋ ์ชฝ์ ๊ฐ๋ฆฌํค๊ณ , rear๋ ์ฝ์
์ฐ์ฐ์ด ์ํ๋๋ ์ชฝ์ ๊ฐ๋ฆฌํจ๋ค.
queue์ ์ฐ์ฐ
enqueue : ์์๋ฅผ ์ถ๊ฐ
dequeue : ์์ง ์ ๊ฑฐ๋์ง ์์ ๊ฐ์ฅ ๋จผ์ ์ฝ์
๋ ์์๋ฅผ ์ถ์ถํ๋ค.
JavaScript๋ก ๊ตฌํํ๊ธฐ
class Queue {
constructor() {
this.storage = [];
this.length = 0;
}
push(element) {
this.storage[this.length++] = element;
}
pop() {
if (this.length !== 0) {
let removed = this.storage[0];
this.storage = this.storage.slice(1);
this.length--;
return removed;
}
}
size() {
return this.length;
}
empty() {
return (this.length ? 0 : 1);
}
front() {
return (this.length ? this.storage[0] : -1);
}
rear() {
return (this.length ? this.storage[this.length - 1] : -1);
}
}
JavaScript
๋ณต์ฌ