ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Data Structure

[์ž๋ฃŒ๊ตฌ์กฐ] ์Šคํƒ Stack

NaNaRin๐Ÿ™ƒ 2021. 1. 22. 15:07

0. ์Šคํƒ Stack ์ด๋ž€ ?

 

์Šคํƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

๋ฐ์ดํ„ฐ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ์ˆœ์„œ๋Š” ํ›„์ž…์„ ์ถœ (LIFO : Last In First Out)

ex ) ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹คํ–‰ํ•  ๋•Œ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์—์„œ ์Šคํƒ ์‚ฌ์šฉ

 

ํ‘ธ์‹œ (push) : ์Šคํƒ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ์ž‘์—…

ํŒ (pop) : ์Šคํƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๋Š” ์ž‘์—…

๊ผญ๋Œ€๊ธฐ (top) : ํ‘ธ์‹œ์™€ ํŒ์„ ํ•˜๋Š” ์œ„์น˜

๋ฐ”๋‹ฅ (bottom) : ์Šคํƒ์˜ ๊ฐ€์žฅ ์•„๋žซ๋ถ€๋ถ„

 

 

์Šคํƒ์˜ push(), pop()

 

 

 

1. ์Šคํƒ ๊ตฌํ˜„

 

int[] stk : ์Šคํƒ ๋ณธ์ฒด์šฉ ๋ฐฐ์—ด. index 0์ธ ์š”์†Œ๊ฐ€ ์Šคํƒ์˜ bottom 

int max : ์Šคํƒ ์šฉ๋Ÿ‰. ์Šคํƒ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฐ์ดํ„ฐ ์ˆ˜

int ptr : ์Šคํƒ ํฌ์ธํ„ฐ. ๋‹ค์Œ push()๋ฅผ ์‹คํ–‰ํ•  ์œ„์น˜. ํ˜„์žฌ ์Šคํƒ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜. ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด num == 0, ์Šคํƒ์ด ๊ฐ€๋“ ์ฐจ ์žˆ์œผ๋ฉด num == max

 

- Stack() : ์ƒ์„ฑ์ž

public Stack(int capacity) {
	ptr = 0;
	max = capacity;
	try {
		stk = new int[max];
	} catch (OutOfMemoryError e) {
		max = 0;
	}
}
  • ๋งค๊ฐœ๋ณ€์ˆ˜ : ์ƒ์„ฑํ•  ์Šคํƒ์˜ ์šฉ๋Ÿ‰
  • ์Šคํƒ์„ ์ƒ์„ฑํ•˜๋ฉด ๋น„์–ด์žˆ์œผ๋ฏ€๋กœ ptr์€ 0
  • ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ capacity๋ฅผ ์Šคํƒ ์šฉ๋Ÿ‰์„ ๋‚˜ํƒ€๋‚ด๋Š” max์— ๋ณต์‚ฌ
  • ์š”์†Œ ์ˆ˜๊ฐ€ max์ธ ๋ฐฐ์—ด stk ์ƒ์„ฑ
  • try-catch๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด ๋ณธ์ฒด ์ƒ์„ฑ์— ์‹คํŒจํ•  ๊ฒฝ์šฐ, max๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐฐ์—ด์— ์ž˜๋ชป ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์Œ

 

 

- push() : ์Šคํƒ์— ๋ฐ์ดํ„ฐ๋ฅผ ํ‘ธ์‹œ

public int push(int x) throws OverFlowStackException {
	if(ptr >= max) {
		throw new OverFlowStackException();
	}
    stk[ptr++] = x;
	return x;
}
  • ๋งค๊ฐœ๋ณ€์ˆ˜ : ํ‘ธ์‹œํ•  ๊ฐ’
  • ์Šคํƒ์ด ๊ฐ€๋“ ์ฐจ์„œ ํ‘ธ์‹œํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•œ OverFlowStackException ์„ throw
  • ์Šคํƒ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„, ์Šคํƒ ํฌ์ธํ„ฐ๋ฅผ ์ฆ๊ฐ€
  • ๋ฐ˜ํ™˜๊ฐ’ : ํ‘ธ์‹œํ•œ ๊ฐ’

 

 

- pop() : ์Šคํƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํŒ

public int pop() throws EmptyStackException {
	if(ptr <= 0) {
		throw new EmptyStackException();
	}
    int x = stk[--ptr];
	return x;
}
  • ์Šคํƒ์˜ ๊ผญ๋Œ€๊ธฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐ
  • ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์ œ๋กœ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ptr์„ ๊ฐ์†Œ์‹œํ‚ด์œผ๋กœ์จ ๋‹ค์Œ push()์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฎ์–ด์”Œ์›Œ์ง
  • ์Šคํƒ์ด ๋น„์–ด์žˆ์–ด ํŒ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•œ EmptyStackException ์„ throw
  • ๋ฐ˜ํ™˜๊ฐ’ : ํŒํ•œ ๊ฐ’

 

 

- peek() : ์Šคํƒ์˜ ๊ผญ๋Œ€๊ธฐ ๊ฐ’, ์Šคํƒ์—์„œ ๋‹ค์Œ์— ๊บผ๋‚ผ ๋ฐ์ดํ„ฐ

public int peek() throws EmptyStackException {
	if(ptr <= 0) {
		throw new EmptyStackException();
	}
	return stk[ptr-1];
}
  • ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•œ EmptyStackException ์„ throw
  • stk[ptr-1]์˜ ๊ฐ’์„ ํ™•์ธ๋งŒ ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ptr ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š์Œ
  • ๋ฐ˜ํ™˜๊ฐ’ : ์Šคํƒ์˜ ๊ผญ๋Œ€๊ธฐ ๊ฐ’

 

 

- indexOf() : ์Šคํƒ ๋ฐ์ดํ„ฐ ํƒ์ƒ‰

public int indexOf(int x) {
	for(int i = ptr - 1; i >= 0; i--) {
		if(stk[i] == x) {
			return i;
		}
	}
	return -1;
}
  • ๋งค๊ฐœ๋ณ€์ˆ˜ : ๊ฒ€์ƒ‰ํ•  ๋ฐ์ดํ„ฐ
  • ์Šคํƒ์— x์™€ ๊ฐ™์€ ๊ฐ’์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋Š”์ง€ ํƒ์ƒ‰ ( ๋จผ์ € ํŒ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๊ผญ๋Œ€๊ธฐ์—์„œ ๋ฐ”๋‹ฅ ๋ฐฉํ–ฅ์œผ๋กœ ์„ ํ˜• ํƒ์ƒ‰ ์ˆ˜ํ–‰ )
  • ๋ฐ˜ํ™˜๊ฐ’ : ์กด์žฌํ•˜๋ฉด ์ฐพ์€ ๋ฐ์ดํ„ฐ์˜ index, ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด -1

 

 

- dump() : ์Šคํƒ ์•ˆ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ

public void dump() {
	if(ptr <= 0) {
		System.out.println("์Šคํƒ์ด ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค");
	} else {
		for(int i = 0; i < ptr; i++) {
			System.out.println(stk[i] + " ");
		}
		System.out.println();
	}
}
  • ์Šคํƒ์— ํ‘ธ์‹œ ๋œ num๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋‹ฅ์—์„œ ๊ผญ๋Œ€๊ธฐ ์ˆœ์œผ๋กœ ๋ชจ๋‘ ์ถœ๋ ฅ
  • ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด "์Šคํƒ์ด ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค" ์ถœ๋ ฅ

 

 

- ๊ธฐํƒ€ ๋ฉ”์†Œ๋“œ

public void clear() {
	ptr = 0;
}

public int capacity() {
	return max;
}

public int size() {
	return ptr;
}

public boolean inEmpty() {
	return ptr <= 0;
}

public boolean inFull() {
	return ptr >= max;
}
  • clear() : ํ˜„์žฌ ์Šคํƒ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์‚ญ์ œ. ์Šคํƒ์˜ ๋ฐฐ์—ด ์š”์†Œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ํ•„์š” ์—†์ด ์Šคํƒํฌ์ธํ„ฐ ptr ๊ฐ’๋งŒ 0์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋จ
  • capacity() : ์Šคํƒ์˜ ์šฉ๋Ÿ‰ max๊ฐ’ ๋ฐ˜ํ™˜
  • size() : ์Šคํƒ์˜ ํ˜„์žฌ ๋ฐ์ดํ„ฐ ์ˆ˜ ptr์„ ๋ฐ˜ํ™˜
  • isEmpty() : ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ. ๋น„์–ด์žˆ๋‹ค๋ฉด true, ์•„๋‹ˆ๋ฉด false
  • isFull() : ์Šคํƒ์ด ๊ฐ€๋“ ์ฐผ๋Š”์ง€ ํ™•์ธ. ๊ฐ€๋“ ์ฐผ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false