๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algoritm/Coding Interview

[3.์Šคํƒ/ํ] stack, queue

by ๐Ÿ’œautumn 2020. 8. 31.

1. Stack

: ๋‹จ์–ด์˜ ์˜๋ฏธ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“์•„ ์˜ฌ๋ฆฐ๋‹ค๋Š” ์˜๋ฏธ

: ๋ฐฐ์—ด ๋Œ€์‹ ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ

: LIFO(Last In First Out) > ๋งˆ์น˜ ์ ‘์‹œ๋ฅผ ์Œ“์•„๋‘์—ˆ๋‹ค๊ฐ€ ๋งจ ์œ„๋ถ€ํ„ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ,

 ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€ํ•œ ํ•ญ๋ชฉ์ด ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋  ํ•ญ๋ชฉ์ด๋ผ๋Š” ๊ฒƒ.

: ๋ฏธ๋กœ ์ฐพ๊ธฐ, ๊ด„ํ˜ธ ์œ ํšจ์„ฑ ์ฒดํฌ, ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ์— ํ™œ์šฉ

: ์ง์ ‘ new์—ฐ์‚ฐ์ž๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉ๊ฐ€๋Šฅ

 

2. Stack์˜ ์—ฐ์‚ฐ

stack.pop() ๊ฐ€์žฅ ์ตœ๊ทผ ์›์†Œ ๋ฐ˜ํ™˜ ํ›„ ์ œ๊ฑฐ
stack.peek() ๊ฐ€์žฅ ์ตœ๊ทผ ์›์†Œ ํ˜ธ์ถœ (์ œ๊ฑฐX)
stack.push(e) ์š”์†Œ ์‚ฝ์ž…
stack.isEmpty() ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ true๋ฐ˜ํ™˜, ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ false๋ฐ˜ํ™˜
stack.search() ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ์ธ๋ฑ์Šค ๋ฐ˜ํ™˜(๋งˆ์ง€๋ง‰ ์š”์†Œ๋กœ๋ถ€ํ„ฐ 1~๋ฐ˜ํ™˜) = pop๊ฐœ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Œ

 

3. Stack ํŠน์ง•

: ๋ฐฐ์—ด๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ƒ์ˆ˜์‹œ๊ฐ„์— i๋ฒˆ์งธ ์š”์†Œ์— ์ ‘๊ทผ ๋ถˆ๊ฐ€

: ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ํ˜น์€ ์‚ญ์ œ๋Š” ์ƒ์ˆ˜์‹œ๊ฐ„์— ๊ฐ€๋Šฅ > ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์›์†Œ๋ฅผ ์˜†์œผ๋กœ ๋ฐ€์–ด์ฃผ๋Š” ์ž‘์—… ๋ถˆํ•„์š”

: ์Šคํƒ์€ ๊ฐ™์€ ๋ฐฉํ–ฅ์—์„œ ์•„์ดํ…œ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ญ์ œํ•œ๋‹ค๋Š” ์กฐ๊ฑดํ•˜์— ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ๋„ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

 

4. stack ์˜ˆ์ œ์ฝ”๋“œ

public static class StackNode {
	private int data; // ์ž๋ฃŒํ˜•์€ T
	private StackNode next;
	public StackNode(int d) {
		this.data=d;
	}
}
private StackNode top;
public int pop() {
	if(top==null) throw new EmptyStackException();
	int item=top.data;
	top=top.next;
	return item;
}
public void push(int item) {
	StackNode t=new StackNode(item);
	t.next=top;
	top=t;
}
public int peek() {
	if(top==null) throw new EmptyStackException();
	return top.data;
}
public boolean isEmpty() {
	return top==null;
}

 

 

5. Queue 

: FIFO(First In First Out) - ๋งคํ‘œ์†Œ ์•ž์— ์ค„์„ ์„œ์„œ ํ‘œ๋ฅผ ๊ตฌ๋งคํ•˜๋“ฏ, ํ์— ์ €์žฅ๋œ ํ•ญ๋ชฉ๋“ค์€ ํ์— ์ถ”๊ฐ€๋˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ œ๊ฑฐ

: BFS, ์บ์‹œ๊ตฌํ˜„, ์ž‘์—… ์šฐ์„  ์ˆœ์œ„, Heap๊ตฌํ˜„ ๋“ฑ์— ํ™œ์šฉ

: LinkedList ํ˜•ํƒœ๋กœ ๊ตฌํ˜„๊ฐ€๋Šฅ

 

6. Queue ์—ฐ์‚ฐ

queue.remove() ์ฒซ๋ฒˆ์งธ ์š”์†Œ ๋ฐ˜ํ™˜ ํ›„ ์ œ๊ฑฐ
queue.poll()
queue.peek() ์ฒซ๋ฒˆ์งธ ์š”์†Œ ๋ฐ˜ํ™˜ (์ œ๊ฑฐX)
queue.element()
queue.add(e) ์š”์†Œ ์‚ฝ์ž… > ํ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ฃผ๊ฐ€
queue.offer(e)
queue.isEmpty() ํ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด true๋ฐ˜ํ™˜, ์š”์†Œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด false๋ฐ˜ํ™˜

 

7. Queue ํŠน์ง•

: ํ ์—ญ์‹œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ - ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ์—์„œ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•œ๋‹ค๋Š” ์กฐ๊ฑดํ•˜์— ๊ตฌํ˜„ ๊ฐ€๋Šฅ

: ํ๋Š” ์ฒ˜์Œ๊ณผ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ ๊ฐฑ์‹ ์„ ์œ ์˜ํ•ด์„œ ๊ตฌํ˜„ํ•ดํ•จ

: ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰(BFS)๊ตฌํ˜„์‹œ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ๋…ธ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ

  => ๋…ธ๋“œํ•˜๋‚˜๋ฅผ ์ฒ˜๋ฆฌํ• ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ํ์— ๋‹ค์‹œ ์ €์žฅ : ๋…ธ๋“œ๋ฅผ ์ ‘๊ทผํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

 

 

8. Queue ์˜ˆ์ œ์ฝ”๋“œ

private static class QueueNode {
	private int data;
	private QueueNode next;
	public QueueNode(int d) {
		this.data=d;
	}
}

private QueueNode first;
private QueueNode last;

public void add(int item) {
	QueueNode t=new QueueNode(item);
	if(last!=null) {
		last.next=t;
	}
	last=t;
	if(first==null) {
		first=last;
	}
}

public int remove() {
	if(first==null) throw new NoSuchElementException();
	int data=first.data;
	first=first.next;
	if(first==null) {
		last=null;
	}
	return data;
}

public int peek() {
	if(first==null) throw new NoSuchElementException();
	return first.data;
}

public boolean isEmpty() {
	return first==null;
}

 

๋Œ“๊ธ€