자바의 정석 11장 (28일차) - Stack&Queue

728x90

Stack

push & pop, 저장, 추출의 관계이고 LIFO(Last in First Out, 마지막으로 저장한 것이 제일 먼저 추출) 형식이다.

순차적으로 저장하고 마지막으로 저장된 객체를 불러오기 때문에 배열[]을 쓰는 것이 제일 적합하다.

 

Stack의 메서드 종류

데이터를 추출할 때(pop) 맨위의 값을 지우는데 지우지 않고 값만 보기위해서는 peek를 사용해야 한다.

  • *메서드에 다른 list 클래스와 동일하게 remove(index)도 존재
  • *push대신 add도 사용가능


Queue

offer & poll, 저장, 추출의 관계이고 FIFO(FIst in First Out, 첫번째로 저장한 것이 제일 먼저 추출) 형식이다.

먼저 저장한 것이 먼저 추출되기 때문에 데이터의 복사를 해야하는 ArrayList에는 비효율적이다. 따라서 LinkedList를 사용하는 것이 적합

 

Queue의 메서드 종류

Stack과는 다르게 push대신 offer, pop대신 poll을사용한다.

  • *push대신 add도 사용가능 

주의할 점:

  • Queue는 인터페이스이기 때문에 자료형 선언이 불가능하다. 따라서 Queue를 구현한 클래스를 구현한 클래스를 사용한다.
  • 아래와 같이 LinkedList가 Queue를 구현한 클래스 중 하나이기 때문에 아래와 같이 선언하여 Queue를 사용한다.
    • Java API에서 Queue를 검색하여 All Known Implementing Classes의 하위목록 클래스를 선택

  • Queue q = new LinkedList();
  • LinkedList q = new LinkedList(); 로 구현해도 문제는 없지만 나중에 코드를 변경할 때 LinkedList만 변경하면 나머지 코드는 변경이 불필요하므로 Queue로 구현한다.
    • Queue라는 동일한 리모콘으로 Queue의 기능을 사용할 수 있는 공통 메서드만 사용했다는 뜻이므로 나머지 코드의 메서드를 체크하고 변경할 필요가 없다.


Stack과 Queue의 예시

출력문:

Stack으로 추출
배열의 크기: 2
첫번째 데이터 추출 후: Student [name=두번째]
배열의 크기: 1
두번째 데이터 확인: Student [name=첫번째]
데이터 인덱스 0번을 지운다
이제 빈칸인가요?: true

Queue로 추출
Student [name=첫번째]
Student [name=두번째]

	Stack<Student> st = new Stack<>();
	System.out.println("Stack으로 추출");
	st.add(new Student("첫번째"));
	st.add(new Student("두번째"));
	
	System.out.println("배열의 크기: " + st.size());
	System.out.println("첫번째 데이터 추출: " + st.pop());
	System.out.println("배열의 크기: " + st.size());
	System.out.println("두번째 데이터 확인: " + st.peek());
	System.out.println("데이터 인덱스 0번을 지운다");
	st.remove(0);
	System.out.println("이제 빈칸인가요?: " + st.empty());
	System.out.println();
	
	
	Queue q = new LinkedList(); //Queue가 인터페이스이므로 LinkedList를 사용
	q.offer(new Student("첫번째"));
	q.add(new Student("두번째"));
	System.out.println("Queue로 추출");
	System.out.println(q.poll());
	System.out.println(q.peek());

Stack과 Queue의 활용

Stack은 어디서 사용될까?

  • 수식계산 : 괄호 뒤에서부터 계산 순차적 실행
  • 워드프로세서 undo/redo : FILO방식이므로 마지막에 실행되었던 값을 저장하면 뒤로가기 버튼을 눌러 값 재출력
  • 웹브라우저 뒤/앞으로 이동 : 워드프로세서 방식과 동일 
  • 등등

Queue는 어디서 사용될까?

  • 최근사용문서 : FIFO방식이므로 마지막에 작업했던 문서를 저장하고 처음에 저장했던 문서를 삭제하여 관리
  • 인쇄작업대기목록 : 출력을 요청받은 문서를 순차적으로 출력  
  • 등등

 

Stack의 활용 코드

1. 값을 최대 3개까지 저장하고 원할경우 저장된값 출력, 그리고 previous 값을 출력하는 코드

		Stack st = new Stack();
		Scanner scanner = new Scanner(System.in);
		while(true) {
			System.out.println("원하시는 목록을 선택해주세요");
			System.out.println("1. 값 추가");
			System.out.println("2. previous 값 출력");
			System.out.println("3. 저장된 값 출력");
			int input = scanner.nextInt();
			if(input == 1) {
				System.out.println("숫자 값 입력");
				if(st.size()>=3) {
					st.remove(0);
				}
				int add = scanner.nextInt();
				st.add(add);
			}
			else if(input == 2) {
				System.out.println(st.pop());
			}
			else if(input == 3) {
				final int size = st.size();
				for(int i = 0; i<size; i++) {
					System.out.println(st.get(i));
				}
			}
		}

 

 

728x90