Java 컬렉션 : 스택 & 큐

Stack

스택은 마지막에 저장된 데이터를 가장 먼저 꺼내오는 LIFO(Last In First Out) 구조로 차곡차곡 쌓인 책이나 박스 등을 생각하면 된다. 순차적으로 데이터를 추가하고 삭제하는 스택에는 ArrayList 같은 배열 컬렉션이 구현하기 적합하다. 또한 스택은 클래스가 정의되어 있어 객체 생성이 가능하다.

  • 활용 : 수식계산, 수식괄호검사, undo/redo, 웹브라우저 앞으로/뒤로

Queue

큐는 처음 저장한 데이터를 가장 먼저 꺼내는 FIFO(First In First Out) 구조로 줄을 서는 것과 같다. 항상 첫번째 데이터를 삭제하는 구조이므로 LinkedList로 구현하는 것이 적합하다. 큐는 인터페이스로 정의되어 있어 직접 구현하거나 구현한 클래스를 사용해야 한다.

  • 활용 : 최근 사용문서, 인쇄작업 대기목록, 버퍼(buffer)

Stack Queue 비교 예제

import java.util.*;

class StackQueueEx {
	public static void main(String[] args) {
		Stack st = new Stack();
		Queue q = new LinkedList();	 // Queue인터페이스의 구현체인 LinkedList를 사용
		
		st.push("0");
		st.push("1");
		st.push("2");

		q.offer("0");
		q.offer("1");
		q.offer("2");

		System.out.println("= Stack =");
		while(!st.empty()) {
			System.out.println(st.pop());
		}

		System.out.println("= Queue =");
		while(!q.isEmpty()) {
			System.out.println(q.poll());
		}
	}
}
= Stack =
2
1
0
= Queue =
0
1
2

Stack 활용 예제

import java.util.*;

public class 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("codechobo.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())
			back.push(forward.pop());
	}

	public static void goBack(){
		if(!back.empty())
			forward.push(back.pop());
	}
}

Queue 활용 예제

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

class prac {
	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.print(">>");
			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;

					// for문 사용
					final int SIZE = tmp.size();
					for (i = 0; i < SIZE; i++)
						System.out.println((i + 1) + "." + tmp.get(i));

					// ListIterator 사용
					// 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("입력오류입니다.");
			}
		} // while(true)
	} //  main()

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

좋은 웹페이지 즐겨찾기