본문 바로가기
알고리즘/복습

[Java] Stack

by 댕꼬 2022. 3. 19.

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

 

[Java] 백준2493_탑문제

https://www.acmicpc.net/problem/2493 2493번: 탑 첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사

java-is-happy-things.tistory.com

https://java-is-happy-things.tistory.com/14

 

[Java] SWEA1218_괄호짝짓기

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14eWb6AAkCFAYD SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy..

java-is-happy-things.tistory.com

 

'알고리즘 > 복습' 카테고리의 다른 글

최장증가수열(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

댓글