728x90
Stack : 자료구조 중 하나, 먼저 집어넣은 데이터가 가장 나중에 나오는 선입후출의 구조(LIFO: Last In First Out)
top : 맨 위에 위치한 인덱스 -> 가장 최근에 들어온 데이터이자 다음에 출력될 값
[활용사례]
- 웹 브라우저 방문기록 (뒤로 가기) : 가장 나중에 열린 페이지부터 다시 보여준다.
- 역순 문자열 만들기 : 가장 나중에 입력된 문자부터 출력한다.
- 실행 취소 (undo) : 가장 나중에 실행된 것부터 실행을 취소한다.
- 수식의 괄호 검사 (연산자 우선순위 표현을 위한 괄호 검사)
- 재귀함수 = 깊이우선탐색 (DFS,Depth-First Search) 구현
[구현]
Stack stack = new Stack();
stack.push() : 스택에 값 삽입
stack.pop() : 스택 값 출력 및 삭제
stack.peek() : 스택 값 출력(확인만 하고 삭제하지 않는다)
stack.isEmpty() : 큐가 비어있는지 true/false로 반환
public class StackAPITest {
public static void main(String[] args) {
Stack stack = new Stack();
System.out.println(stack.isEmpty());
stack.push("조댕댕");
System.out.println(stack);
stack.push("조꼬미");
System.out.println(stack);
stack.push("조달래");
System.out.println(stack);
System.out.println(stack.pop());
System.out.println(stack);
System.out.println(stack.pop());
System.out.println(stack);
System.out.println(stack.pop());
System.out.println(stack);
System.out.println(stack.pop()); //null
}
}
스택으로 웹 브라우저 방문(V), 뒤로가기(B), 앞으로가기(F) 구현하기
(현재 ssafy사이트 -> naver 사이트 -> 앞으로가기(활성화x) -> 다음사이트 -> 뒤로가기 -> 뒤로가기 -> 앞으로가기 -> 앞으로가기)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class StackBrowserTest {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Stack<String> backword = new Stack<String>();
Stack<String> forword = new Stack<String>();
String current = "http://www.ssafy.com";
while (true) {
String input = br.readLine();
if (input.charAt(0) == 'Q')
break;
StringTokenizer st = new StringTokenizer(input, " ");
switch (st.nextToken()) {
case "V": // visit
backword.push(current); //전 사이트 backword 스택에 넣어주기
forword.clear(); // 앞으로가기 모두 삭제
current = st.nextToken(); //현재사이트 갱신
break;
case "B":
if(backword.isEmpty()) {
System.out.println("Ignored..");
continue;
}
forword.push(current); //뒤로 왔으므로 그 전사이트 forword에 넣어주기
current=backword.pop(); //현재사이트 갱신
break;
case "F":
if(forword.isEmpty()) {
System.out.println("Ignored..");
continue;
}
backword.push(current); //앞으로 왔으므로 전사이트 backword에 넣어주기
current = forword.pop(); //현재사이트 갱신
break;
}
System.out.println(current);
}
}
}
이 예제는 위 주소창에서 직접 <- , -> , 주소입력을 하며 실행해보니 훨씬 이해가 빨리간다.
[예제]
https://java-is-happy-things.tistory.com/13
https://java-is-happy-things.tistory.com/14
728x90
'알고리즘 > 복습' 카테고리의 다른 글
최장증가수열(LIS) (0) | 2022.04.06 |
---|---|
Knapsack알고리즘 (0) | 2022.04.05 |
[Java] Queue (0) | 2022.03.19 |
[Java] 부분집합(Subset) (0) | 2022.03.15 |
[Java] 조합 (0) | 2022.03.14 |
댓글