반응형
스택
LIFO, Last-in, First-out 이 한마디로도 스택의 모든 것을 설명한다고 볼 수 있다. 삽입과 삭제가 한 방향에서만 이루어지는 자료구조로서 이해를 돕기 위해 현실의 예를 들어보자.
우리가 옷 정리를 안해서 옷 위에 옷을 계속 올리는 구조.. 그것이 바로 스택이다.
새로운 옷을 위에 올리는 것, 이것이 Push() 이고 맨 위의 옷을 가져가 다시 입는 것, 이것이 Pop() 이다. 물론 이것은 자바의 컬렉션에서 기가 막히게 제공을 하지만 처음에는 이해를 위해 직접 구현해보도록 하자.
구현을 하기 위해서 배열과 리스트를 사용할 수 있다. 바로 코드를 보도록 하겠다.
코드
1. 배열을 이용해 구현한 스택
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
|
import java.util.NoSuchElementException;
public class Stack_arr <E> {
private E a[];
private int top;
public Stack_arr() {
a = (E[]) new Object[1];
top = -1;
}
//동적인 배열을 만들기 위해 resize()함수를 만든다.
public void resize(int length) {
E b[] = (E[]) new Object[length];
for(int i=0; i<top+1; i++) b[i] = a[i];
a = b;
}
public void push(E item) {
if(top+1 == a.length) resize(2*a.length);
a[++top] = item;
}
public E pop() {
if(isEmpty()) throw new NoSuchElementException();
if(top == a.length/4) resize(a.length/2);
E pop = a[top];
a[top] = null;
top = top-1;
return pop;
}
public E peek() {
if(isEmpty()) throw new NoSuchElementException();
return a[top];
}
//배열에서는 맨 뒤가 top이 된다.
public void show() {
for(int i=0; i<=top; i++) {
System.out.print(a[i] + " ");
}
System.out.print("\t<--top");
System.out.println();
}
public boolean isEmpty() {
return top==-1;
}
public int getSize() {
return top+1;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
2. 리스트를 이용해 구현한 스택
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
71
72
73
74
75
76
77
|
import java.util.EmptyStackException;
import java.util.NoSuchElementException;
public class Stack_linkedlist <E> {
private Node top;
private int size;
//isEmpty(), getSize() 알아서
public Stack_linkedlist() {
top = null;
size = 0;
}
public void push(E item) {
top = new Node(item, top);
size++;
}
public E pop() {
if(isEmpty()) throw new EmptyStackException();
E item = (E)top.getItem();
top = top.getNext();
size--;
return item;
}
public E peek() {
if(isEmpty()) throw new NoSuchElementException();
return (E) top.getItem();
}
public void show() {
System.out.print("top-->\t");
Node a = top;
while(a!=null) {
System.out.print(a.getItem() + " ");
a = a.getNext();
}
System.out.println();
}
public boolean isEmpty() {
return size==0;
}
public int size() {
return size;
}
}
class Node <E> {
private E item;
private Node next;
public Node(E item, Node next) {
this.item = item;
this.next = next;
}
public E getItem() {
return item;
}
public void setItem(E item) {
this.item = item;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
반응형
'자료구조' 카테고리의 다른 글
[Java][자료구조] Queue / 큐 - 배열과 리스트를 사용한 구현 (0) | 2019.06.21 |
---|---|
[Java][자료구조] Tree (3) - 이진트리 순회 구현과 예시 (0) | 2019.05.14 |
[Java][자료구조] Tree (2) - 이진 트리 구현과 전위,중위,후위,레벨 순회 (0) | 2019.05.13 |
[Java][자료구조] Tree (1) - 트리의 정의와 특성, 이진트리에 대하여 (0) | 2019.04.08 |