Stack, Queue

조수경·2021년 10월 29일
0

고급자바

목록 보기
2/97
  • Stack ==> 후입선출(LIFO)의 자료구조
  • Queue ==> 선입선출(FIFO)의 자료구조

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();
     }
  
  
  }
profile
신입 개발자 입니다!!!

0개의 댓글

관련 채용 정보