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
Author And Source
이 문제에 관하여(Java 컬렉션 : 스택 & 큐), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@chicori3/Java-컬렉션-스택-큐저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)