백엔드/Java

JAVA - Stack과 Queue의 활용

dami97 2023. 3. 29. 23:01
반응형

우리가 쉽게 찾아볼 수 있는 스택과 큐의 활용 예

  • 스택의 활용 예
    • 수식계산, 수식괄호검사, 워드프로세서의 undo/redo, 웹브라우저의 뒤로/앞으로
  • 큐의 활용 예
    • 최근 사용문서, 인쇄작업 대기목록, 버퍼(buffer)

스택과 큐의 활용 예제

package collectionsFramework;

import java.util.Stack;

//스택과 큐의 활용 예제
public class java221106_StackEx1 {
	public static Stack back = new Stack();
	public static Stack forward = new Stack();
	
	public static void main(String[] args) {
		goURL("1.네이트");
		goURL("2.야후");
		goURL("3.네이버");
		goURL("4.다음");
		
		printStatus();
		
		goBack();
		System.out.println(" = 뒤로 버튼을 누른 후 =");
		printStatus();
		
		goBack();
		System.out.println(" = 뒤로 버튼을 누른 후 =");
		printStatus();
		
		goForward();
		System.out.println(" = 앞으로 버튼을 누른 후 =");
		printStatus();
		
		goURL("naver.com");
		System.out.println(" = 새로운 주소로 이동 후 =");
		printStatus();
		
	}
	
	public static void printStatus() {
		System.out.println("back: " + back);
		System.out.println("forward: " + forward);
		System.out.println("현재화면은 '" + back.peek() + "' 입니다.");
		System.out.println();
	}
	
	public static void goURL(String url) {
		back.push(url);
		if(!forward.empty()) {
			forward.clear();
		}
		
	}
	
	public static void goForward() {
		if(!forward.empty()) {
			forward.push(forward.pop());
		}
	}
	
	public static void goBack() {
		if(!back.empty()) {
			forward.push(back.pop());
		}
	}
	
}

/*
back: [1.네이트, 2.야후, 3.네이버, 4.다음]
forward: []
현재화면은 '4.다음' 입니다.

 = 뒤로 버튼을 누른 후 =
back: [1.네이트, 2.야후, 3.네이버]
forward: [4.다음]
현재화면은 '3.네이버' 입니다.

 = 뒤로 버튼을 누른 후 =
back: [1.네이트, 2.야후]
forward: [4.다음, 3.네이버]
현재화면은 '2.야후' 입니다.

 = 앞으로 버튼을 누른 후 =
back: [1.네이트, 2.야후]
forward: [4.다음, 3.네이버]
현재화면은 '2.야후' 입니다.

 = 새로운 주소로 이동 후 =
back: [1.네이트, 2.야후, naver.com]
forward: []
현재화면은 'naver.com' 입니다.
*/
package collectionsFramework;

import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Queue;
import java.util.Scanner;

/*
	유닉스의 history명령어를 Queue를 이용해서 구현한 예제
	대부분의 프로그램이 최근에 열어 본 문서들의 목록을 보여주는 기능을 제공하는데
	이 기능도 예제를 이용하면 쉽게 구현 가능
 * */
public class java221107_QueueEx1 {
	static Queue q = new LinkedList();
	static final int MAX_SIZE = 5;		// Queue에 최대 5개까지만 저장되도록 한다.
	
	public static void main(String[] args) {
		System.out.println("help를 입력하면 도움말을 볼 수 있습니다.");
		
		while(true) {
			System.out.println(">>");
			
			try {
				//화면으로부터 라인단위로 입력받는다.
				Scanner s = new Scanner(System.in);
				String input = s.nextLine().trim();
				
				if("".equals(input)) continue;
				
				
				if(input.equalsIgnoreCase("q")) {
					System.exit(0);
				} else if (input.equalsIgnoreCase("help")) {
					System.out.println(" help - 도움말을 보여줍니다.");
					System.out.println(" q 또는 Q - 프로그램을 종료합니다.");
					System.out.println(" history - 최근에 입력한 명령어를 " + MAX_SIZE + "개 보여줍니다.");
				} else if (input.equalsIgnoreCase("history")) {
					int i = 0;
					// 입력받은 명령어를 저장하고,
					save(input);
					
					// LinkedList의 내용을 보여준다.
					LinkedList tmp = (LinkedList)q;
					ListIterator it = tmp.listIterator();
					
					while(it.hasNext()) {System.out.println(++i+"."+it.next());}
					
				}else {
					save(input);
					System.out.println(input);
				} //if(input.equalsIgnoreCase("q")) {
			} catch (Exception e) {
				System.out.println("입력 오류입니다.");
			}
				
			
		}
	}

	public static void save(String input) {
		//queue에 저장한다.
		if(!"".equals(input))
			q.offer(input);
		
		// queue의 최대크기를 넘으면 제일 처음 입력된 것을 삭제한다.
		if(q.size() > MAX_SIZE) // size()는 Collection 인터페이스에 정의
			q.remove();
	}
}