Skip to content

Commit 3d834f5

Browse files
authored
Merge pull request #11 from Data-Structure-Study/ever
[Ever] Stack 구현
2 parents 59f6638 + 09a19b5 commit 3d834f5

File tree

11 files changed

+257
-0
lines changed

11 files changed

+257
-0
lines changed

Diff for: ever/.idea/.gitignore

+126
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: ever/.idea/description.html

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: ever/.idea/encodings.xml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: ever/.idea/misc.xml

+9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: ever/.idea/modules.xml

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: ever/.idea/project-template.xml

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: ever/.idea/vcs.xml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: ever/ever.iml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" inherit-compiler-output="true">
4+
<exclude-output />
5+
<content url="file://$MODULE_DIR$">
6+
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
7+
</content>
8+
<orderEntry type="inheritedJdk" />
9+
<orderEntry type="sourceFolder" forTests="false" />
10+
</component>
11+
</module>
12+

Diff for: ever/src/com/codesquad/stack/Main.java

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.codesquad;
2+
3+
public class Main {
4+
5+
public static void main(String[] args) {
6+
Stack<Integer> s = new Stack<Integer>();
7+
s.push(1);
8+
s.push(2);
9+
s.push(3);
10+
s.push(4);
11+
System.out.println(s.pop());
12+
System.out.println(s.pop());
13+
System.out.println(s.peek());
14+
System.out.println(s.pop());
15+
System.out.println(s.isEmpty());
16+
System.out.println(s.pop());
17+
System.out.println(s.isEmpty());
18+
}
19+
}

Diff for: ever/src/com/codesquad/stack/README.md

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
## 특징
2+
- 후입선출(LIFO, Last In First Out)
3+
4+
상자안에 책을 쌓는다고 생각을 하면 됩니다. 즉 가장 먼저 넣은 책은 가장 나중에 꺼낼 수 있으며, 가장 최근에 넣은 책을 가장 먼저 뺄수 있습니다.
5+
6+
## 메소드
7+
- pop(): 스택에서 가장 위에 있는 항목을 제거한다.
8+
- push(item): item 하나를 스택의 가장 윗 부분에 추가한다.
9+
- peek(): 스택의 가장 위에 있는 항목을 반환한다.
10+
- isEmpty(): 스택이 비어 있을 때에 true를 반환한다.
11+
12+
## 사용 사례
13+
- 웹 브라우저 방문기록 (뒤로가기)
14+
- 실행 취소 (undo)
15+
- 역순 문자열 만들기
16+
- 수식의 괄호 검사 (연산자 우선순위 표현을 위한 괄호 검사)
17+
Ex) 올바른 괄호 문자열(VPS, Valid Parenthesis String) 판단하기
18+
- 후위 표기법 계산
19+
20+
## 구현
21+
`Array` 기반 스택은 접근 속도가 빠르지만 변경이 용이하지 않습니다. 배열은 생성할 때, 메모리의 연속된 공간에 데이터를 저장합니다. 그렇기 때문에 검색할 때는 데이터를 빠르게 찾을 수 있지만, 변경이 일어났을 때는 새로운 배열을 생성하고, 생성된 배열에 데이터를 복사해야하기 때문에 느려집니다. 복사해야할 데이터가 많지 않다면, 크게 상관 없지만 데이터가 많아질수록 점점 더 느려질 것입니다.
22+
23+
반면에 `Linked List` 기반 스택은 메모리 주소를 통해 노드가 연결되어 있어, 가르키는 메모리 주소만 변경하면 되므로, 등록, 수정과 같은 변경에는 빠르게 반응할 수 있습니다. 하지만, 메모리에 연속된 공간에 존재하지 않기 때문에 검색 데이터를 찾기 위해 노드를 순회해야하므로 검색 속도는 좋지 않습니다.

Diff for: ever/src/com/codesquad/stack/Stack.java

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.codesquad;
2+
3+
import java.util.EmptyStackException;
4+
5+
public class Stack<T> {
6+
7+
private Node<T> top;
8+
9+
public class Node<T> {
10+
public T data;
11+
public Node<T> next;
12+
13+
public Node(T data, Node<T> next) {
14+
this.data = data;
15+
this.next = next;
16+
}
17+
}
18+
19+
public T pop() {
20+
if (this.top == null) {
21+
throw new EmptyStackException();
22+
}
23+
24+
T data = this.top.data;
25+
this.top = this.top.next;
26+
return data;
27+
}
28+
29+
public T peek() {
30+
if (top == null) {
31+
throw new EmptyStackException();
32+
}
33+
34+
return this.top.data;
35+
}
36+
37+
public void push(T data) {
38+
this.top = new Node<>(data, top);
39+
}
40+
41+
public boolean isEmpty() {
42+
return this.top == null;
43+
}
44+
}

0 commit comments

Comments
 (0)