Java

[고급자바] Stack & Queue

elog 2023. 3. 2. 00:00

1. Stack

: 후입선출(LIFO :Last In First Out)

 

A. 자료 입력

- push(입력값)

 

B. 자료 출력

- pop() : 자료를 꺼내온 후 꺼내온 자료를 Stack에서 삭제한다.

- peek() : 삭제없이 자료를 꺼내온다.

 

C. 코드

public class StackQueueTest {
	public static void main(String[] args) {
    
		Stack<String> stack = new Stack<>();
		stack.push("홍길동");
		stack.push("일지매");
		stack.push("성춘향");
		stack.push("변학도");
		System.out.println("현재 stack ==> " + stack);
		System.out.println();
		
		String data = stack.pop();
		System.out.println("꺼내온 값 : " + data);
		System.out.println("꺼내온 값 : " + stack.pop());
		System.out.println("현재 stack ==> " + stack);
		
		stack.push("강감찬");
		System.out.println("현재 stack ==> " + stack);
		
		System.out.println("꺼내온 값 : " + stack.pop());
		System.out.println("현재 stack ==> " + stack);
		
		System.out.println("삭제없이 꺼내온 값 : " + stack.peek());
		System.out.println("현재 stack ==> " + stack);
	}
}


2. Queue

: 선입선출(FIFO : First In First Out)

 

A. 자료 입력

- offer(입력값)

 

B. 자료 출력

- poll() : 자료를 꺼내오고 꺼내온 자료를 Queue에서 삭제한다.

- peek() : 삭제없이 자료를 꺼내온다.

 

*Queue는 LinkedList를 이용해서 사용할 수 있다.

 

C. 코드

public class StackQueueTest {
	public static void main(String[] args) {
    
		Queue<String> queue = new LinkedList<>();
		queue.offer("홍길동");
		queue.offer("일지매");
		queue.offer("성춘향");
		queue.offer("변학도");
		
		System.out.println("현재 Queue ==> " + queue);
		System.out.println();
		
		String temp = queue.poll();
		System.out.println("꺼내온 값 : " + temp);
		System.out.println("꺼내온 값 : " + queue.poll());
		
		System.out.println("현재 Queue ==> " + queue);

		queue.offer("강감찬");
		System.out.println("현재 Queue ==> " + queue);
		
		System.out.println("꺼내온 값 : " + queue.poll());
		System.out.println("현재 Queue ==> " + queue);
		
		System.out.println("삭제없이 꺼내온 값 : " + queue.peek());
		System.out.println("현재 queue ==> " + queue);	
	}
}


3. StackTest

A. Browser 클래스

// 웹브라우저의 앞으로 가기, 뒤로 가기 기능 구현하기 (스택 이용)
class Browser{
	private Stack<String> back;		// 이전 방문 내역이 저장될 스택
	private Stack<String> forward;	// 다음 방문 내역이 저장될 스택
	private String currentURL;
	
	public Browser() {
		back = new Stack<>();
		forward = new Stack<>();
		currentURL = "";
	}
	
	// 사이트를 방문하는 메서드 ==> 매개변수에는 방문할 URL이 저장된다.
	public void goURL(String url) {
		System.out.println(url + "사이트로 이동합니다.");
		
		if(currentURL != null && !"".equals(currentURL)) {	// 현재 페이지가 있으면
			back.push(currentURL);	// 현재 페이지를 back 스택에 추가한다.
		}
		currentURL = url;	// 현재 페이지를 이동할 페이지로 변경한다.
		forward.clear();	// forward 스택 비우기
	}
	
	// 뒤로 가기 메서드
	public void goBack() {
		// isEmptu() ==> 컬렉션이 비었는지 여부를 검사하는 메서드
		if (!back.isEmpty()) {	// back 스택이 비어있지 않으면
			forward.push(currentURL);	// 현재 페이지를 forward 스택에 추가한다.
			currentURL = back.pop();	// back 스택에서 꺼내온 데이터를 현재 페이지로 한다. 
		}
	}
	
	// 앞으로 가기 메서드
	public void goForward() {
		if (!forward.isEmpty()) {	// forward 스택이 비어있지 않으면
			back.push(currentURL);	// 현재 페이지를 back 스택에 추가한다.
			currentURL = forward.pop();	// forward 스택에서 꺼내온 데이터를 현재 페이지로 한다.
		}
	}
	
	// 방문 기록 확인하는 메서드
	public void history() {
		System.out.println();
		System.out.println("\t방 문 기 록");
		System.out.println("----------------------");
		System.out.println("back		=> " + back);
		System.out.println("현재		=> " + currentURL);
		System.out.println("forward		=> " + forward);
		System.out.println("----------------------");
		System.out.println();
	}
}

 

B. main 메서드

Browser b = new Browser();
b.history();

b.goURL("1. 네이버");
b.history();

b.goURL("2. 구글");
b.history();

b.goURL("3. 다음");
b.goURL("4. 네이트");
b.history();

System.out.println("뒤로가기 후...");
b.goBack();
b.history();

System.out.println("뒤로가기 후...");
b.goBack();
b.history();

 

System.out.println("앞으로 가기 후...");
b.goForward();
b.history();

System.out.println("새로운 사이트로 접속한 후...");
b.goURL("5. DDIT");
b.history();

C. 전체 코드

package kr.or.ddit.basic;

import java.util.Stack;

public class StackTest {
	public static void main(String[] args) {
		Browser b = new Browser();
		
		b.history();
		b.goURL("1. 네이버");
		b.history();
		
		b.goURL("2. 구글");
		b.history();
		
		b.goURL("3. 다음");
		b.goURL("4. 네이트");
		b.history();
		
		System.out.println("뒤로가기 후...");
		b.goBack();
		b.history();
		
		System.out.println("뒤로가기 후...");
		b.goBack();
		b.history();
		
		System.out.println("앞으로 가기 후...");
		b.goForward();
		b.history();
		
		System.out.println("새로운 사이트로 접속한 후...");
		b.goURL("5. DDIT");
		b.history();
	}
}

// 웹브라우저의 앞으로 가기, 뒤로 가기 기능 구현하기 (스택 이용)
class Browser{
	private Stack<String> back;		// 이전 방문 내역이 저장될 스택
	private Stack<String> forward;	// 다음 방문 내역이 저장될 스택
	private String currentURL;
	
	public Browser() {
		back = new Stack<>();
		forward = new Stack<>();
		currentURL = "";
	}
	
	// 사이트를 방문하는 메서드 ==> 매개변수에는 방문할 URL이 저장된다.
	public void goURL(String url) {
		System.out.println(url + "사이트로 이동합니다.");
		
		if(currentURL != null && !"".equals(currentURL)) {	// 현재 페이지가 있으면
			back.push(currentURL);	// 현재 페이지를 back 스택에 추가한다.
		}
		currentURL = url;	// 현재 페이지를 이동할 페이지로 변경한다.
		forward.clear();	// forward 스택 비우기
	}
	
	// 뒤로 가기 메서드
	public void goBack() {
		// isEmptu() ==> 컬렉션이 비었는지 여부를 검사하는 메서드
		if (!back.isEmpty()) {	// back 스택이 비어있지 않으면
			forward.push(currentURL);	// 현재 페이지를 forward 스택에 추가한다.
			currentURL = back.pop();	// back 스택에서 꺼내온 데이터를 현재 페이지로 한다. 
		}
	}
	
	// 앞으로 가기 메서드
	public void goForward() {
		if (!forward.isEmpty()) {	// forward 스택이 비어있지 않으면
			back.push(currentURL);	// 현재 페이지를 back 스택에 추가한다.
			currentURL = forward.pop();	// forward 스택에서 꺼내온 데이터를 현재 페이지로 한다.
		}
	}
	
	// 방문 기록 확인하는 메서드
	public void history() {
		System.out.println();
		System.out.println("\t방 문 기 록");
		System.out.println("----------------------");
		System.out.println("back		=> " + back);
		System.out.println("현재		=> " + currentURL);
		System.out.println("forward		=> " + forward);
		System.out.println("----------------------");
		System.out.println();
	}
}

'Java' 카테고리의 다른 글

[고급자바] 정렬(Comparator, Comparable)  (0) 2023.03.03
[고급자바] Set, Ilterator  (1) 2023.03.02
[고급자바] ArrayList 문제  (0) 2023.03.01
[고급자바] Collection(List)  (0) 2023.03.01
[고급자바] Collection(Vector)  (0) 2023.03.01