# 스택(stack)이란?
- 스택(Stack)은 사전적으로 '더미', '쌓아 올림' 이라는 의미
- 후입선출(LIFO - Last In First Out) 형태의 자료구조
- 제일 마지막에 저장한 데이터를 제일 먼저 꺼내는 구조
- 책을 바닥에 순서대로 쌓아 놓고, 다시 책을 꺼낼때 마지막에 쌓은 것부터 꺼내는 방식
- Stack 클래스는 LIFO 자료구조를 구현한 클래스로 JAVA에서 '컬렉션 프레임워크' 로 이미 제공
- 스택을 구현하는 방법은 배열과 연결 리스트가 있음
# 스택(stack) API
pop(추출)
- 가장 최 상위에 위치한 자료를 추출한 후에 스택에서 제거한다
- 이 작업은 O(1)의 복잡도를 가진다
push(삽입)
- 스택의 최 상위에 새로운 자료를 삽입한다
- 이 작업은 O(1)의 복잡도를 가진다
isEmpty
- 스택이 empty 상태인지 확인한다
clear
- 스택에 존재하는 모든 자료들을 삭제한다
peek
- 가장 최 상위에 위치한 자료를 추출한다
pop 메소드와는 달리 스택에서 제거하지는 않는다.
- 이 작업은 O(1)의 복잡도를 가진다
# 스택(stack) 클래스 사용법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | import java.util.Stack; public class Main { static Stack <Integer> stack; public static void main(String[] args) { stack = new Stack <Integer>(); // stack 초기화 stack.clear(); // stack에 데이터 1 삽입 stack.add(1); // stack에 대이터 5 삽입 stack.add(5); // stack의 size 출력 System.out.println("stack size = " +stack.size()); // stack에서 데이터 확인 및 제거 System.out.println("data = " +stack.pop()); // stack에서 데이터 확인 System.out.println("data = " +stack.peek()); // stack에서 데이터 확인 및 제거 stack.pop(); // stack에 데이터가 없는지 확인 if (stack.isEmpty()) { System.out.println("stack is empty"); } } } /********** 결과 ********** stack size = 2 data = 5 data = 1 stack is empty */ | cs |
# 스택(Stack) 구현 - 배열 사용
# 문제
N(2<= N <=100)개의 수를 순서대로 Stack에 넣은 후 하나씩 꺼내 화면에 출력
# 입력
2 // 테스트 케이스 수
5 // 데이터 크기
1 2 3 4 5
5
5 4 2 3 1
# 출력
#1 5 4 3 2 1
#2 1 3 2 4 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | import java.util.Scanner; class Main { static final int MAX_N = 100; static int top; static int stack[] = new int[MAX_N]; static void stackInit() { top = 0; } static boolean stackIsEmpty() { return (top == 0); } static boolean stackIsFull() { return (top == MAX_N); } static boolean stackPush(int value) { if (stackIsFull()) { System.out.println("stack overflow!"); return false; } stack[top] = value; top++; return true; } static Integer stackPop() { if (top == 0) { System.out.println("stack is empty!"); return null; } top--; Integer value = new Integer(stack[top]); return value; } public static void main(String arg[]) throws Exception { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); for (int test_case = 1; test_case <= T; test_case++) { int N = sc.nextInt(); stackInit(); for (int i = 0; i < N; i++) { int value = sc.nextInt(); stackPush(value); } System.out.print("#" + test_case + " "); while (!stackIsEmpty()) { Integer value = stackPop(); if (value != null) { System.out.print(value.intValue() + " "); } } System.out.println(); } sc.close(); } } | cs |
# 참고사이트
https://hyeonstorage.tistory.com/262
https://gompangs.tistory.com/5
https://ehclub.co.kr/3059
https://songeunjung92.tistory.com/18
'자료구조' 카테고리의 다른 글
이진검색트리 (Binary Search Tree) (정리중,,,,,,) (0) | 2019.03.04 |
---|---|
큐(Queue) 개념 및 사용법 정리 (0) | 2019.03.03 |
배열 리스트(ArrayList) 개념 및 사용법 (0) | 2019.03.03 |
자바 배열 사용법 정리 (0) | 2019.03.03 |