Stack과 Queue는 LinkdeList를 이용해서 사용할 수 있다.
(Stack은 Stack이라는 클래스가 별도로 존재한다.)
- Stack의 명령
1. 자료 입력 : push(입력데이터)
2. 자료 출력 : pop() ==> 자료를 꺼내온 후 꺼내온 자료를 Stack에서 삭제한다.
peek() ==> 삭제 없이 자료를 꺼내온다.
--주로 꺼내올때는 push,pop사용 하고 자료 확인은peek
Stack stack = new Stack<>();
// LinkedList stack2 = new LinkedList<>();
stack.push("홍길동");
stack.push("일지매");
stack.push("변학도");
stack.push("강감찬");
//stack은 뒤에서 꺼내간다!!
System.out.println("stack => "+ stack);
String data = stack.pop();
System.out.println("꺼내온 값 : "+data);//뒤에 있는게 먼저 나옴
System.out.println("꺼내온 값 : "+stack.pop());//뒤에서 두번째 값이 나옴
System.out.println("stack => "+ stack);
System.out.println();
//끝에 추가됨
stack.push("성춘향");
System.out.println("stack => " + stack);
System.out.println("꺼내온 값 : " + stack.pop());//뒤에 값이 나옴
System.out.println("stack => " + stack);
System.out.println();
System.out.println("삭제 없이 꺼내온 값:" + stack.peek());
System.out.println("stack => "+ stack);
System.out.println();
System.out.println("-----------------------------------");
- Queue의 명령
1. 자료 입력 : offer(입력데이터)
2. 자료 출력 : poll() ==> 자료를 꺼내오고 그 자료를 Queue에서 삭제한다.
peek() ==> 삭제없이 자료를 꺼내온다.
//LinkedList는 queue인터페이스를 구현한 list클래스이다.
Queue queue = new LinkedList<>();
queue.offer("홍길동");
queue.offer("일지매");
queue.offer("변학도");
queue.offer("강감찬");
System.out.println("queue => " + queue);//뒤에가 입구 앞에가 출구
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();
System.out.println("꺼내온 데이터 : " + queue.poll());
System.out.println("queue => " + queue);
System.out.println();
System.out.println("삭제 없이 꺼내오기 : " + queue.peek());//강감찬이 나오지만 삭제가 안되고
System.out.println("queue => " + queue);//다나옴
System.out.println();
//stack은 어디에 이용할까? 뒤로가기/앞으로가기, 메서드 호출이 끝나면 자신을 호출한 곳으로 돌아감(작업영역이 생김): callstack(저장의 역순)
//queue는 어디에 이용할까? 프린터를 출력할때 순서대로 출력시키기 위해서 저장되어 있다가 차례로 출력되는 것(차례로출력)
//stack의 이용
package kr.or.ddit.basic;
import java.util.Stack;
public class StackTest {
public static void main(String[] args) {
Browser b = new Browser();
b.goURL("1.네이버");
b.goURL("2.야후");
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.네이트");
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 Stack 데이터 전체 삭제.
}
// 뒤로가기 기능
public void goBack(){
// isEmpty back 이라는 Stack의 값이 비어있냐? 를 boolean 으로 반환
if(!back.isEmpty()){
forward.push(currentURL); // 현재 페이지를 forward스택에 추가
currentURL = back.pop(); // back에서 1개의 페이지(요소)를 꺼내와 현재 페이지로 한다.
}
}
// 앞으로가기 기능
public void goForward(){
if(!forward.isEmpty()){
back.push(currentURL); // 현재 페이지를 back 스택에 추가
currentURL = forward.pop(); // forward에서 1개의 요소를 꺼내와서 현재 페이지로 한다.
}
}
//방문 기록 확인하기.
public void history(){
System.out.println("--------------------");
System.out.println("방 문 기 록");
System.out.println("--------------------");
System.out.println("back : " + back);
System.out.println("현재페이지 : " + currentURL);
System.out.println("forward : " + forward);
System.out.println("--------------------");
System.out.println();
}
}