โ ๊ฐ์ฅ ํด๋ณผ๋งํ ๊ฐ์น๊ฐ ์๋ ํ๋ก์ ํธ๋ ๋น์ ํ์ฌ์ ํ๋ก์ธ์ค ๋ ๋ฒจ์ ์์ ํ ํ ๋ฑ๊ธ ๋ฎ์ถฐ ์ค ๊ทธ๋ฐ ํ๋ก์ ํธ์ด๋ค. โ
- Tom DeMarco
Peopleware ์ ์

Stack ์๋ฃ๊ตฌ์กฐ
Stack ํน์ง์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ฝ์ด ๊ฐ๋ฅํ๋ค.
- LIFO(Last In First Out), ํ์ ์ ์ถ(ๅพๅ ฅๅ ๅบ) ๊ตฌ์กฐ์ด๋ค. ๋ง์ง๋ง์ ๋ค์ด์จ๊ฒ ์ฒซ๋ฒ์งธ๋ก ๋น ์ ธ๋๊ฐ๋ค.
- ๊ทธ๋์ ์ง์ ์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฐ๊ณ ์ฌ ์ ์๋ค.
- ๋ค๋ก ๊ฐ๊ธฐ, ์คํ ์ทจ์(redo/undo), ๊ทธ๋ฆฌ๊ณ ์ปดํจํฐ ๊ตฌ์กฐ์์์ ์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ํ์ ์ด๋ค.
- ๊ท ํ์ฑ ๊ฒ์ฌ๋ฅผ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์, ๊ดํธ ๋ฑ์ ๊ฒ์ฌ์์๋ ์ฐ์ธ๋ค.

[JCF] ๐งฑ Stack ๊ตฌ์กฐ & ์ฌ์ฉ๋ฒ ์ ๋ฆฌ
Stack ์ปฌ๋ ์ ์คํ(Stack)์ ์ฌ์ ์ ์ ์๋ '์๋ค', '๋๋ฏธ' ๋ก์ ์ ์ ์คํ์ฒ๋ผ ์ ์๋ฅผ ์์๋์ ๊ฒ์ ๋งํ๋ค. ์ฆ, ์์์ ๋ฌผ๊ฑด์ ์์ ์ฌ๋ฆฌ๋ฏ์ด ๋ฐ์ดํฐ๋ฅผ ์๋ ์๋ฃ ๊ตฌ์กฐ๋ผ๊ณ ํ ์ ์๋ค. ์๋ ๊ทธ๋ฆผ
inpa.tistory.com
Stack ์ค์ ๊ตฌํํ๊ธฐ (๋ฐฐ์ด)
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ(Stack) ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ง์ ๊ตฌํํ ๋ ์ฌ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐฐ์ด(Array)์ ์ด์ฉํ ์คํ ๊ตฌํ์ด๋ค. ์ง์ ํ๋ฒ ๊ตฌํํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด์.
ํด๋์ค ํ๋ & ์์ฑ์ ์ ์ํ๊ธฐ
- DEFAULT_CAPACITY : ๋ฐฐ์ด์ด ์์ฑ ๋ ๋์ ๊ธฐ๋ณธ ํ ๋น ์ฉ๋
- arr : ์์๋ค์ ๋ด์ ๋ด๋ถ ๋ฐฐ์ด
- top : ์คํ์ ๊ฐ์ฅ ๋ง์ง๋ง ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ์ธ๋ฑ์ค ํ๋. ์ด๊น๊ฐ์ -1๋ก ์ค์ ํ๋ค. ์ด top์ ์ด์ฉํด์ ์คํ์ ์์ ์ถ๊ฐ/์ญ์ ์ ๋ชจ๋ ๋์์ด ์ด๋ฃจ์ด ์ง๋ค.
public class MyStack<E> {
private static final int DEFAULT_CAPACITY = 6; // ์ต์ ์ฉ๋ ํฌ๊ธฐ
private Object[] arr; // ์์๋ฅผ ๋ด์ ๋ด๋ถ ๋ฐฐ์ด
private int top; // ์คํ์ ๊ฐ์ฅ ๋ง์ง๋ง ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
// ์์ฑ์
public MyStack() {
this.arr = new Object[DEFAULT_CAPACITY]; // 6 ์ฉ๋์ผ๋ก ๋ด๋ถ ๋ฐฐ์ด ์์ฑ
this.top = -1;
}
}
isFull / isEmpty ๊ตฌํํ๊ธฐ
๋ณธ๊ฒฉ์ ์ธ push, pop ๊ตฌํ์ ์์ ์คํ์ ๊ณต๊ฐ์ ๊ฒ์ฌํ๋ ๋ฉ์๋๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํ๋ค. ์ด๋ค์ ์คํ์ ๋ฐฐ์ด์ด ๊ฝ ์ฐจ์๋์ง ๊ฒ์ฌ๋ฅผ ํ๊ณ ์๋์์ ๊ตฌํํ resize ๋์์ ํํ๋ ๋ถ๊ธฐ๋ฌธ ํํ๋ก ์ฌ์ฉ๋์ด์ง ๊ฒ์ด๋ค.
- isFull() : ๊ฝ์ฐจ์์ ๊ฒฝ์ฐ true
- isEmpty() : ๋น์ด์์ ๊ฒฝ์ฐ false
public boolean isFull() {
// ๋ง์ง๋ง ์์ ์์น์ธ top์ด ๋ฐฐ์ด ๊ธธ์ด - 1 ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ๋๊น์ง ์ฐจ์๋ ๊ฒ๊ณผ ๊ฐ์
return top == arr.length - 1;
}
public boolean isEmpty() {
// ๋ง์ง๋ง ์์ ์์น์ธ top์ด -1์ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ, ๋ฐฐ์ด์ด ๋น์ด์๋ ๊ฒ๊ณผ ๊ฐ์
return top == -1;
}
resize ๊ตฌํํ๊ธฐ
๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋์ด์๊ธฐ ๋๋ฌธ์ ๋ง์ผ ๋ฐฐ์ด ์ฉ๋(capacity)๊ฐ ๊ฝ์ฐจ๊ฒ ๋๋ฉด ๋์ด์ ์์๋ฅผ ์ถ๊ฐํ ์ ๊ฐ ์๋ค. ๊ทธ๋์ ๋ช๋ช ์คํ ๊ตฌํ ์์ ์์๋ ๋ฐฐ์ด์ด ๊ฝ์ฐจ๋ ด ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ์ง ์๊ณ ๋์ด์ ์์๋ฅผ ๋ฐ์ง ์๋๋ก ์์ธ๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ๋ ์๋๋ฐ, ์ด ํฌ์คํ ์์๋ ์ข๋ ์ ์ฐํ๊ฒ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ฐ๋ณ ๋ฐฐ์ด ์ฒ๋ฆฌ๋ฅผ ํตํด ๊ตฌํํด๋ณผ ๊ฒ์ด๋ค.
resize() ๋ฉ์๋๋ ์คํ์ ์์๊ฐ ์ถ๊ฐ, ์ญ์ ๋ฑ์ ๋์์ด ๋ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํธ์ถ๋๋ค. ๋ง์ง๋ง ์์๋ฅผ ๊ฐ๋ฆฌํค๋ top์ ์ธ๋ฑ์ค ๊ฐ๊ณผ ๋ฐฐ์ด์ ์ฉ๋(arr.length)์ ๋น๊ตํ์ฌ, ํฌ๊ฑฐ๋ ์์ ๊ฒฝ์ฐ ์ด๋ฅผ ๊ฐ์งํด์ ๋ฆฌ์ฌ์ด์ง์ ์ฒ๋ฆฌํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ๋ฅผ ๋
ธ๋ฆฐ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
// ํด๋์ค ๋ด๋ถ์์๋ง ์คํ๋๋ ๋ฉ์๋์ด๋ private
private void resize() {
int arr_capacity = arr.length - 1; // ํ์ฌ ๋ฐฐ์ด์ ์ฉ๋์ -1 ํ ๊ฐ์ ์ป์ (๋ฐฐ์ด ์ธ๋ฑ์ค๋ 0๋ถํฐ ์์ํ๋๊น)
// ์ฉ๋์ด ๊ฝ์ฐฌ ๊ฒฝ์ฐ
if() ... ์ฌ์ด์ฆ๋ฅผ ๋๋ฆฐ๋ค
// ์ฉ๋์ ๋นํด ๋ฐ์ดํฐ ์์ด ์ ์ ๊ฒฝ์ฐ
if() ... ์ฌ์ด์ฆ๋ฅผ ์ค์ธ๋ค
}
1. ์ฉ๋์ด ๊ฝ์ฐฌ ๊ฒฝ์ฐ
์๋ ์ฝ๋์์ ์ฉ๋์ 2๋ฐฐ๋ก ์ค์ ํ๋ ์ด์ ๋ ๋๋ํ๊ฒ ๊ณต๊ฐ์ ์ ์งํ๊ธฐ ์ํด์์ด๋ค. ์๋ํ๋ฉด resize ๋ฉ์๋๊ฐ ์์ฃผ ํธ์ถ๋์ด ๋ฐฐ์ด์ ๋ณต์ฌํ์ฌ ์๋ก ๋ง๋๋ ํ์๊ฐ ๋น๋ฒํ ์ผ์ด๋๋ค๋ฉด ์ฑ๋ฅ์ ๋ง์ด๋์ค๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋น ๊ณต๊ฐ์ ์๋์ผ๋ก null๋ก ์ฑ์์ง๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ ์๋ค. ๋ค๋ง ์๋ฃ๊ตฌ์กฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ํ์ฅ ๊ธฐ์ค์ด ๋ค๋ฅผ์ ์๋ค๋ ์ ์ ์ ์ํ์.
// ์ฉ๋์ด ๊ฝ์ฐฌ ๊ฒฝ์ฐ
if(top == arr_capacity) {
// ๋๋ํ๊ฒ ๊ณต๊ฐ์ ์ ์งํ๊ธฐ ์ํด ํ์ฌ ์ฉ๋์ ๋๋ฐฐ๋ก ์ค์
int new_capacity = arr.length * 2;
// ๋ณต์ฌํ ๋ฐฐ์ด์ new_capacity ์ฉ๋ ๋งํผ ์ค์ ํ๊ณ arr ์์๋ค์ ์ ์ฒด ๋ณต์ฌํด์ ๋ฃ๊ณ ๋ฐํ (๋น๊ณต๊ฐ์ null)
arr = Arrays.copyOf(arr, new_capacity);
return;
}
2. ์ฉ๋์ ๋นํด ๋ฐ์ดํฐ ์์ด ์ ์ ๊ฒฝ์ฐ
์ ์ ํ ๊ณต๊ฐ์ ์ ์งํ๋ค ๋๋ฌด ๋ฐฐ์ด ์์๊ฐ ๊ณต๊ฐ์ ๋นํด ์ ๊ฒ ๋ค์ด์์ ๊ฒฝ์ฐ ์ต์ ํ๋ฅผ ์ํด ๋ฆฌ์ฌ์ด์ง ํ๋ ์์ ์ด๋ค.
ํฌ๊ธฐ ๊ณ์ฐ ๊ธฐ์ค์ ํ์ฌ ๋ฐฐ์ด ์์ ๊ฐฏ์(size)๊ฐ ํ์ฌ ๋ฐฐ์ด ์ฉ๋(capacity)์ ์ ๋ฐ ๋ณด๋ค ์์ ๊ฒฝ์ฐ๋ก ์ ํ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์ ๋ณต์ฌํ ๋ ์ถ์ํ ๋ฐฐ์ด์ ์ฉ๋์ ์ ํ ๋ Math.max() ๋ฉ์๋๋ฅผ ์ด์ฉํ์๋๋ฐ, ์์์ ๋ฆฌ์คํธ์ ๊ธฐ๋ณธ ํ ๋น ์ฉ๋์ ์ ํ์์ผ๋, ์ด์ ๋ํ ์์น์ ๋ฐ๋ฅด๊ธฐ ์ํด ์ ๋ฐ์ผ๋ก ์ค์ธ ์ฉ๋๋ณด๋ค ๊ธฐ๋ณธ ์ฉ๋์ด ๋ ํด ๊ฒฝ์ฐ ๊ธฐ๋ณธ ์ฉ๋์ผ๋ก ์ค์ ํ๊ธฐ ์ํด์๋ค.
// ์ฉ๋์ ๋นํด ๋ฐ์ดํฐ ์์ด ์ ์ ๊ฒฝ์ฐ
if (top < (arr_capacity / 2)) {
// ๊ธฐ์กด ์ฉ๋์ ๋ฐ์ ์ค์
int half_capacity = arr.length / 2;
// half_capacity ์ ๋ํดํธ ์ฉ๋ ์ค ํฐ๊ฑธ ๋ณต์ฌ
arr = Arrays.copyOf(arr, Math.max(half_capacity, DEFAULT_CAPACITY));
return;
}
Push ๊ตฌํํ๊ธฐ
์คํ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ์์ ์ push ๋ผ๊ณ ํ๋ค. (๋ฆฌ์คํธ์์์ add์ ๊ฐ์ ์ญํ ์ด๋ค)
๋ฐ์ดํฐ๋ฅผ ์คํ์ push ํ๊ธฐ ์์ ๋ฐ๋์ ์คํ์ด ๊ฝ ์ฐจ์๋์ง ๊ฒ์ฌ๋ฅผ ํ๊ณ , ๋น ๊ณต๊ฐ์ด ์๋ค๋ฉด ์์์ ๊ตฌํํ ๋ฆฌ์ฌ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ฉด ๋๋ค.
public E push(E value) {
// 1. ๋ฐฐ์ด์ด ๊ฝ ์ฐจ์๋์ง ๊ฒ์ฌํ๋ค.
if (isFull())
resize(); // ๊ฝ ์ฐผ์ผ๋ฉด ๋ฐฐ์ด ๋ฆฌ์ฌ์ด์ง ์คํ
// 2. ์์๋ฅผ ์ถ๊ฐํ ์์ ์ด๋ ๋ง์ง๋ง ์์ ์์น์ธ top์ 1 ์ฆ๊ฐ์ํจ๋ค.
top++;
// 3. ๊ทธ๋ฆฌ๊ณ ํด๋น ๋ฐฐ์ด ์์น์ ์์๋ฅผ ์ถ๊ฐํ๋ค.
arr[top] = value;
// 4. ๋ฃ์ ์์์ ๊ฐ์ ๋ฐํ๋ค.
return value;
}
1. ๋จผ์ ์คํ์ ๋น๊ณต๊ฐ์ด ์๋์ง ๊ฒ์ฌํ๋ค.

2. ๋น๊ณต๊ฐ์ด ์๋ค๋ฉด Top์ ํ๋ ์ฆ๊ฐ์ํจ๋ค.

3. Top ์์น์ ์์๋ฅผ ์ถ๊ฐํ๋ค.

Pop ๊ตฌํํ๊ธฐ
์คํ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋ ์์ ์ pop ์ด๋ผ๊ณ ํ๋ค. (๋ฆฌ์คํธ์์์ remove์ ๊ฐ์ ์ญํ ์ด๋ค)
๋ฐ์ดํฐ๋ฅผ ์คํ์ pop ํ๊ธฐ ์์ ๋ฐ๋์ ์คํ์ ๊บผ๋ผ ๋ฐ์ดํฐ๊ฐ ์๋์ง ๊ฒ์ฌ๋ฅผ ํ๊ณ , ๊บผ๋ผ ์์๊ฐ ์์ผ๋ฉด EmptyStackException ์์ธ๋ฅผ ๋ฐ์ ์ํจ๋ค.
@SuppressWarnings("unchecked")
public E pop() {
// 1. ๋ฐฐ์ด์ด ๋น์ด์์ผ๋ฉด ์์ธ ๋ฐ์
if (isEmpty())
throw new EmptyStackException();
// 2. ๋จผ์ arr[top] ์์๋ฅผ ๋ฐฑ์
ํ๋ค.
E value = (E) arr[top];
// 3. ํด๋น ์์น์ ์์๋ฅผ ์ญ์ ํ๋ค.
arr[top] = null;
// 4. top์ 1 ๊ฐ์ ์ํจ๋ค.
top--;
// 5. ํน์ ๋ค์ด์๋ ์์์ ๋นํด ๋น๊ณต๊ฐ์ด ๋ง์ผ๋ฉด ์ต์ ํ๋ฅผ ์ํด ๋ฆฌ์ฌ์ด์ง์ ํด์ค๋ค.
resize();
// 6. ๋ฐฑ์
ํ ์์๋ฅผ ๋ฐํํ๋ค.
return value;
}
@SuppressWarnings("unchecked")
Object ๋ฐฐ์ด์ธ arr์์ ๊ฐ์ ธ์ค๊ฒ ๋๋ ์์๊ฐ Object ํ์ ์ด๋ผ ์ ๋ค๋ฆญ E ํ์ ์ผ๋ก ํ๋ณํํด์ค์ผ ํ๋๋ฐ, ํ๋ณํ ํ๋ ๊ณผ์ ์์ ์๋ง ์๋ํฐ์์ ๊ฒฝ๊ณ ์ฐฝ์ด ๋จ๊ฒ ๋ ๊ฒ์ด๋ค. ์๋ํ๋ฉด ์ ๋ค๋ฆญ ์์ฒด๊ฐ ํ์ธ๋์ง ์์ ๋ชจํธํ ํ์ ์ด๋ผ ๊ทธ๋ ๋ค.
ํ์ง๋ง ์ด์ฐจํผ ์คํ ํด๋์ค์์ ์ ๋ค๋ฆญ ํ์ ์ผ๋ก๋ง ์์๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ํ ์์ ์ฑ์ด ํ๋ณด๋๋ฏ๋ก ClassCastException์ด ๋จ์ง ์์ผ๋ ์ด ๊ฒฝ๊ณ ๋ค์ ๋ฌด์ํ๊ฒ ๋ค๋ ์๋ฏธ์ธ ์ด๋ ธํ ์ด์ ์ธ @SuppressWarnings("unchecked") ์ ๋ฉ์๋ ์์ ๋ถ์ฌ์ค๋ค.
๋ค๋ง ์ด ์ด๋ ธํ ์ด์ ์ ๋จ๋ฐํ๋ฉด ์๋๊ณ , ์บ์คํ ์ ์์ธ ๊ฐ๋ฅ์ฑ์ด ํ์คํ ์์ ๊ฒฝ์ฐ์๋ง ์จ์ฃผ๋ ๊ฒ์ด ์ข๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค์ํ ๊ฒฝ๊ณ ๋ฉ์ธ์ง๋ฅผ ๋์น ์๋ ์๋ค.
1. ๋จผ์ ์คํ์ ๊บผ๋ผ ์์๊ฐ ์๋์ง ๊ฒ์ฌํ๊ณ , ์์๋ฅผ ๊บผ๋ธ๋ค.

2. ์์๋ฅผ ๊บผ๋์ผ๋ฉด ์คํ์ Top์ 1 ๊ฐ์ ์ํจ๋ค. ๊ทธ๋ฌ๋ฉด ๊ณ์ ์คํ์ ๋ง์ง๋ง ์์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.

Peek ๊ตฌํํ๊ธฐ
์คํ์ ๋ง์ง๋ง ์์์ ๊ฐ๋ง ํ์ธํ๊ณ ๊บผ๋ด์ง๋ ์๊ณ ์ถ์ ์ํฉ์ด ์์ ์ ์๋ค. ๊ทธ๋ด ๋ ์ฐ๋ ๊ฒ์ด peek ๋์์ด๋ค. ๊ฐ๋จํ ๋งํ์๋ฉด pop ์์ ์ญ์ ๊ณผ์ ๋ง ์๋ ๊ฒ์ด peek ์ธ ๊ฒ์ด๋ค.
@SuppressWarnings("unchecked")
public E peek() {
// 1. ๋ฐฐ์ด์ด ๋น์ด์์ผ๋ฉด ์์ธ ๋ฐ์
if (isEmpty())
throw new EmptyStackException();
// 2. ์คํ์ ๋ง์ง๋ง ์์ ๊ฐ๋ง ๋ฐํํ๋ค. (์ญ์ X)
return (E) arr[top];
}

search ๊ตฌํํ๊ธฐ
์คํ์ search ๋์์ ๋ฆฌ์คํธ์ indexOf ์ ๋น์ทํ์ง๋ง ์ฝ๊ฐ ์ฐจ์ด๊ฐ ์๋ค. search ์ ๋ฐํ ์ซ์๋ ์คํ์ ์๋จ์ ์์น๋ก๋ถํฐ ์ผ๋ง๋งํผ ๋จ์ด์ ธ ์๋ ์ง์ ๋ํ ์๋์ ์์น ๊ฐ์ด๋ค.
์ด๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ์๋์ ๊ฐ์ด ๋๋ค. ์ฆ, ๋งจ ๋ง์ง๋ง ๋ฐ์ดํฐ๊ฐ 1์ด๋ผ๋ ์๋ฏธ๋ ์ฒซ๋ฒ์งธ๋ก ๊บผ๋ด์ง ์์๋ผ๋ ๋ป์ด ๋๊ฒ ๋๋ค.

public int search(E value) {
// ์คํ ๋งจ ์ ์๋ถํฐ ์๋๋ก ์ํํ์ฌ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ ์์น๋ฅผ ๊ตฌํ๋ค.
for (int i = top; i >= 0; i--) {
if(arr[i].equals(value)) {
return top - i + 1;
}
}
// ๋ง์ผ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์๋ค๋ฉด -1์ ๋ฐํ
return -1;
}
toString ๊ตฌํํ๊ธฐ
์คํ ๋ฐฐ์ด์ ์ฝ์ ํ๋ฉด์ ์ถ๋ ฅํ๊ธฐ ์ํ ๋ฉ์๋์ด๋ค. ๊ฐ๋จํ๊ฒ Arrays.toString(๋ด๋ถ๋ฐฐ์ด) ์ฝ๋๋ฅผ ํตํด ๊ตฌํํด์ฃผ๋ฉด ๋๋ค.
@Override
public String toString() {
return Arrays.toString(arr);
}
์ง๊ธ๊น์ง ์คํ์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ง์ ๊ตฌํํด๋ณด์๋ค. ๋ง์ง๋ง์ผ๋ก ์ง์ ๊ตฌํํด๋ณธ ์คํ ์๋ฃ๊ตฌ์กฐ๊ฐ ์ ๋์๋๋์ง ์๋ ์คํ ์ฝ๋๋ก ํ ์คํธ๋ฅผ ํด๋ณด์.
public static void main(String[] args) {
MyStack<Integer> stack = new MyStack<>();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
System.out.println(stack); // [1, 2, 3, 4]
System.out.println(stack.peek()); // 4
System.out.println(stack.search(4)); // 1
System.out.println(stack.search(3)); // 2
stack.pop();
stack.pop();
stack.pop();
System.out.println(stack); // [1]
}
Stack ์ค์ ๊ตฌํํ๊ธฐ (ArrayList ์ฌํ์ฉ)
์ฌ์ค ์๋ฐ์๋ ๋ณ๋๋ก java.util.Stack ํด๋์ค๊ฐ ์กด์ฌํ๋ค. ํ์ง๋ง ์ด Stack ํด๋์ค๋ ์ง์์ด ๋๊ธด ๊ตฌ์ ํด๋์ค์ธ Vector๋ฅผ ์์ํ๊ณ ์์ด ์ฌ๋ฌ๋ชจ๋ก ๋ฌธ์ ์ ์ด ๋ง๋ค.
๋ฐ๋ผ์ ์ง์ ์คํ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ์ฌ์ผ ํ๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ์ง์ ๋ด๋ถ ๋ฐฐ์ด์ ์ด์ฉํด ํ๋ ํ๋ ์คํ์ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์ข์ง๋ง, ๋ ์ข์ ๋ฐฉ๋ฒ์ ์๋ฐ์ ๋ํ์ ์ธ ๊ฐ๋ณ ๋ฐฐ์ด ํด๋์ค์ธ java.util.ArrayList๋ฅผ ์ด์ฉํ์ฌ, ๋ฆฌ์คํธ์ ๋ฉ์๋๋ฅผ ์์์ ํตํด push, pop ๋์๋ง ๋ณ๋๋ก ์ถ๊ฐํด์ฃผ๋ ์์ผ๋ก ๋ณด๋ค ๊ฐ๋จํ๊ฒ ์คํ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
์ด๋ฏธ ๊ณต๊ฐ ๋ฆฌ์ฌ์ด์ง์ด ๊ตฌํ๋์ด์๋ ArrayList๋ฅผ ์ด์ฉํ๋ฉด ๋ณ๋๋ก ๋น ๊ณต๊ฐ ๊ฒ์ฌํ ํ์๊ฐ ์๊ณ ์ฝ๋๋ ํจ์ฌ ๊ฐ๋จํด์ง๋ค.
public class MyStack<E> {
private ArrayList<E> list; // ์์๋ฅผ ๋ด์ ๋ด๋ถ ๋ฆฌ์คํธ
private int top; // ์คํ์ ๊ฐ์ฅ ๋ง์ง๋ง ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
// ์์ฑ์
public MyStack() {
this.list = new ArrayList<>();
this.top = -1; // ๊ธฐ๋ณธ ๋น ๊ฐ์ ํํํ๊ธฐ ์ํด -1 ๋ก ์ด๊ธฐํ
}
public boolean isFull() {
return top == list.size() - 1;
}
public boolean isEmpty() {
return top == -1;
}
// ArrayList์์ ์์์ ๋ฆฌ์ฌ์ด์ง ๋๋ ๊ตฌํํ ํ์๊ฐ ์๋ค.
// private void resize() {}
public E push(E value) {
list.add(++top, value); // ๋ฆฌ์คํธ์ ++top ์์น์ value๋ฅผ ์ถ๊ฐ
return value;
}
public E pop() {
E value = list.get(top);
list.remove(top--); // ๋ฆฌ์คํธ์ top ์์น์ ์์๋ฅผ ์ญ์ ํ๊ณ top ๊ฐ์
return value;
}
public E peek() {
return list.get(top);
}
public int search(E value) {
// ์คํ์ ๊ฐ์ ์์๊ฐ์ด ์์ผ๋ฉด ๊ฐ์ฅ ๋ง์ง๋ง์ ์ถ๊ฐํ ์์๋ฅผ ๋จผ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ lastIndexOf() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
int result = list.lastIndexOf(value);
if (result != -1) {
return top - result + 1;
} else {
return result;
}
}
@Override
public String toString() {
return list.toString(); // ArrayList์ toString() ๋ฉ์๋๋ง ํธ์ถ ํ๋ฉด ๋๋ค.
}
}
# ์ฐธ๊ณ ์๋ฃ
https://www.programiz.com/dsa/stack
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.