개인공부

Stack & Queue

리승우 2022. 8. 15. 20:21

스택(Stack)

LIFO구조, 마지막에 저장된 것을 제일 먼저 꺼낸다. (Last In First Out)

배열구조로 구현하는 것이 유리하다.

 

큐(Queue)

FIFO구조, 제일 먼저 저장한 것을 제일 먼저 꺼낸다 (First In First Out)

LinkedList로 구현하는 것이 유리하다

 

스택(Stack) 메서드

> 스택은 클래스다 그렇기에 아래와 같이 객체생성 후 활용이 가능하다.

Stack st = new Stack();

st.push("0");

 

 

큐(Queue) 메서드

> 큐는 인터페이스다. 그렇기에 스택처럼 객체생성 후 활용하는 것이 불가능하다. 

 

큐(Queue) 인터페이스를 구현한 클래스 찾기

인터페이스 Queue를 사용하기 위한 방법 2가지

1. Queue를 직접 구현

2. Queue를 구현한 클래스를 사용

 

우선 2번 방법으로 아래 진행과정 기술해놓음

아래 객체생성으로 인터페이스 Queue를 사용가능함.

Queue g = new LinkedList();

      g.offer("0");

 

※ 아래와 같이 객체생성하여 진행해도됨.

LinkedList g = new LinkedList();

      g.offer("0")

하지만!!  참조변수 타입을 Queue 클래스로 진행하는 것이 좋음. 

WHY?

1. 추후 Queue를 구현한 클래스 목록 중 다른 것을 사용할 때 변동할 것이 많다.

Queue를 클래스 참조변수로 할 경우, new LinkedList();부분만 바꾸면 어떤 클래스를 쓰든 상관이 없어진다. (같거나 더 많은 기능을 가진 클래스를 가져온다한들, 참조변수 타입이 Queue라는 고정적이고 공통적인 기능을 가진 리모콘이니 염려할 필요성이 제거됨 )

=> 참조변수의 타입은 가능하면 좁혀주는 것이 좋음 (조상으로)

 

2. LinkedList만의 메소드를 사용하지 않았고, 공통 메소드만을 썼다는 뜻.

LinkedList외, 다른 클래스에서도 보유하고 있는 공통 메소드만을 썼으므로 (Queue 인터페이스에 있는 메소드만을 썼다는 것이 입증되니) g.offer("0")코드를 검토할 필요가 사라짐.

 

Stack / Queue 예제

import java.util.*;

public class ex11_2 {
	public static void main(String[] args) {
		Stack st = new Stack();
		Queue q = new LinkedList(); // Queue 인터페이스의 구현체인 LinkedList 사용
		
		st.push("0");
		st.push("1");
		st.push("2");
		
		q.offer("0");
		q.offer("1");
		q.offer("2");
		
		System.out.println("= Stack =");
		while(!st.empty()) { // 비었는지 확인하고 비어있지 않으면 아래 명령문 실행함
			System.out.println(st.pop()); //스택에서 요소 하나를 꺼내
		}
		
		System.out.println("= Queue =");
		while(!q.isEmpty()) { // 비었는지 확인하고 비어있지 않으면 아래 명령문 실행함
			System.out.println(q.poll());
		}
	}
}

출력값

= Stack =
2
1
0
= Queue =
0
1
2

 

 

Stack / Queue 활용