우리가 쉽게 찾아볼 수 있는 스택과 큐의 활용 예
- 스택의 활용 예
- 수식계산, 수식괄호검사, 워드프로세서의 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();
}
}