스택은 마지막에 저장된 데이터를 가장 먼저 꺼내오는 LIFO(Last In First Out) 구조로 차곡차곡 쌓인 책이나 박스 등을 생각하면 된다. 순차적으로 데이터를 추가하고 삭제하는 스택에는 ArrayList
같은 배열 컬렉션이 구현하기 적합하다. 또한 스택은 클래스가 정의되어 있어 객체 생성이 가능하다.
큐는 처음 저장한 데이터를 가장 먼저 꺼내는 FIFO(First In First Out) 구조로 줄을 서는 것과 같다. 항상 첫번째 데이터를 삭제하는 구조이므로 LinkedList
로 구현하는 것이 적합하다. 큐는 인터페이스로 정의되어 있어 직접 구현하거나 구현한 클래스를 사용해야 한다.
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
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());
}
}
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