728x90
본 글은 Udemy의 자바 자료구조 강의를 듣고 개인적으로 학습한 내용 복습하기 위해 작성된 글로 내용상 오류가 있을 수 있습니다. 오류가 있다면 지적 부탁 드리겠습니다.
Stack(스택)
1. Stack?
1.1 Stack의 특징
Stack은 한 쪽 끝에서만 항목을 삭제하거나 새로운 항목을 저장하는 자료구조이다.
스택에서 새로운 항목을 저장하는 연산을 push
라고 하고, 항목을 삭제하는 연산을
pop
이라고 한다.
- LIFO(Last In First Out) : 선입선출
- 대부분의 고수준의 언어(high level language)에서 스택은 Array나 Linked List로 쉽게 구현할 수 있다.
1.2 Stack의 Push 연산
주어진 항목을 스택의 맨 위에 놓는 연산으로 O(1)의 시간복잡도를 가진다.
1.3 Stack의 Pop 연산
마지막으로 스택에 삽입한 항목을 제거하는 연산으로 O(1)의 시간복잡도를 가진다.
1.4 Stack의 Peek 연산
Stack의 맨 위의 항목을 제거하지 않고 반환하는 연산으로 O(1) 시간복잡도를 가진다.
2. Stacks in memory management (Stack, Heap)
2.1 Call Stack
- 프로그램의 코드 정보(서브루틴/메서드/함수)를 저장하는 Stack 자료구조이다.
- 세부 정보는 일반적으로 고급 프로그래밍 언어에서는 숨겨져있고, 자동화 되어있다.
- Stack은 현재 실행 중인 서브루틴을 실행한 다음 어디로 반환해야할지를 추적한다.
- 각 함수에 의해 생성된 임시 변수를 저장하는데도 쓰인다.
- 함수가 새로운 변수를 선언할 때 마다 Stack에 push가 된다.
- 함수를 종료할 때마다 모든 변수는 Stack에서 pop되고 영구적으로 사라지게 된다.
- local 변수는 Stack에 있다가 함수가 종료되면 사라지게 된다.
- Stack의 메모리는 제한적이다.
2.2 Heap meomory
- Heap은 자동으로 관리되지 않는 메모리 영역이다.
- Stack 메모리와 달리 대용량 메모리 영역이다.
- Java의 경우 레퍼런스 타입이나 객체(인스턴스)가 생성되는 공간이다.
- 메모리가 자동으로 관리되지 않기 때문에 할당을 해제해야만 한다.
- 그렇지 않으면 메모리 누수가 발생하여 느려질 수 있다.
2.3 Stack Memory VS, Heap Memory
stack memory | heap memory |
---|---|
사이즈 제한 O | 사이즈 제한 X |
접근이 빠름 | 접근이 느림 |
지역변수 | 객체, 인스턴스 |
CPU에 의해 공간이 효츌적으로 관리됨 | 메모리가 조각날수 있음 |
변수는 리사이즈 X | 변수는 리사이즈 O |
3. Stacks and recursive method calls
4. Stack implementation : Linked List
5. Stack implementation : Array
6. Dijkstra's interpreter
6.1 Dijkstra's interpreter
- 수학식을 파싱하기 위한 메서드
- Shunting-yard 알고리즘은 stack을 기반으로 하나의 stack은 숫자를 또다른 stack은 연산자를 저장한다.
- Shunting-yard 알고리즘은 연산자를 우선으로 파싱하는데 일반적으로 사용한다.
6.2 Dijkstra's interpreter implementation
7. Stack Questions
7.1 Max in a stack problem : Stack 최대값 찾기
- The aim is to design an algorithm that can return the maximum item of a stack in O(1) running time complexity. We can use O(N) extra memory!
- Hint: we can use another stack to track the max item
7.2 Queue Implementation with Stacks : Stack으로 Queue 구현하기
- The aim is to design a queue abstract data type with the help of stacks.
해결책
- Stack의 도움을 받아 큐를 구현하기 위해서는 2개의 Stack을 사용하면된다.
- 첫번째 Stack은
enqueue()
연산을 수행한다. - 두번째 Stack은
dequeue()
연산을 수행한다.
7.3 Queue Implementation with Stacks : Stack으로 Queue 구현하기 2
해결책
- 재귀호출을 통해 Stack 하나로 Queue를 구현할 수 있다.