MyCloud

JAVA의 Stack 본문

Programming/Data Structure

JAVA의 Stack

Swalloow 2016. 3. 11. 02:26



자료구조 - 스택



스택은 가장 최근에 들어온 데이터가 가장 먼저 나가는 후입선출(LIFO) 구조입니다.

스택에는 삽입(PUSH) 연산과 삭제(POP) 연산이 존재하는데

삽입의 경우 가장 높은 위치(TOP)에 쌓이게 되며

삭제의 경우 가장 마지막에 들어온 데이터, 즉 TOP에 위치한 데이터가 삭제 됩니다.







JAVA로 Stack 구현


스택을 구현하는 방법은 2가지가 있습니다.

배열을 이용한 스택과 연결리스트를 이용한 스택입니다.

먼저 배열을 이용한 스택 구현입니다.



1
2
3
4
5
6
7
8
9
10
11
12
public class CStackArray {
 
    private int top;
    private int maxSize;
    private Object[] stackArray;
 
    // 최대 크기로 배열 생성
    public CStackArray(int maxSize){
        this.maxSize = maxSize;
        this.stackArray = new Object[maxSize];
        this.top = -1;
    }
cs


스택의 가장 꼭대기를 가리키는 top 변수, 

배열의 최대 크기를 받는 maxSize 변수가 있습니다.



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
    // 스택이 비어있는지 체크
    public boolean empty(){
        return (top == -1);
    }
 
    // 스택이 꽉찼는지 체크
    public boolean full(){
        return (top == maxSize-1);
    }
 
    // 삽입연산
    public void push(Object item){
        if(full()) throw new ArrayIndexOutOfBoundsException((top+1)+">=" + maxSize);
        stackArray[++top] = item;
    }
 
    // 스택의 가장 위의 데이터 반환
    public Object peek(){
        if(empty()) throw new ArrayIndexOutOfBoundsException(top);
        return stackArray[top];
    }
 
    // 삭제연산
    public Object pop(){
        Object item = peek();
        top--;
 
        return item;
    }
cs


empty, full 함수는 스택이 비었는지 차있는지를 체크해주고

push, pop 함수를 통해 삽입, 삭제 연산이 이루어집니다.


다음은 연결리스트를 이용한 스택입니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class CStackList {
    
    private Node top;
    private class Node{
        private Object data;
        private Node nextNode;
 
        Node(Object data){
            this.data = data;
            this.nextNode = null;
        }
    }
 
    // 생성자를 통한 스택초기화
    public CStackList(){
        this.top = null;
    }
cs


노드는 데이터 필드와 다음 노드를 가리키는 포인터 필드로 구성됩니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    // 스택이 비어있는지 확인
    public boolean empty(){
        return (top == null);
    }
 
    // 삽입연산
    public void push(Object item){
        Node newNode = new Node(item);
        newNode.nextNode = top;
        top = newNode;
    }
 
    // 스택의 가장 위의 데이터 반환
    public Object peek(){
        if(empty()) throw new ArrayIndexOutOfBoundsException();
        return top.data;
    }
 
    // 삭제연산
    public Object pop(){
        Object item = peek();
        top = top.nextNode;
        return item;
    }
cs

배열과 마찬가지로 삽입, 삭제가 이루어집니다.







JAVA의 Stack


Java에서는 Stack을 편리하게 사용할 수 있도록 API를 제공합니다.

java.util.Stack<E>는 Vector를 상속받고 있으며,

주요 메소드는 다음과 같습니다.



 Method

 Description 

 boolean empty()

 Stack이 비어있는지 알려줌

 Object peek()

 스택의 맨 위에 저장된 객체를 반환

 Object pop()

 스택의 맨위에 저장된 객체를 삭제

 Object push(Object item)

 스택에 객체를 삽입

 int search(Object o)

 스택에서 주어진 객체를 찾아서 위치를 반환



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    // 스택이 비어있는지 확인
    public boolean empty(){
        return (top == null);
    }
 
    // 삽입연산
    public void push(Object item){
        Node newNode = new Node(item);
        newNode.nextNode = top;
        top = newNode;
    }
 
    // 스택의 가장 위의 데이터 반환
    public Object peek(){
        if(empty()) throw new ArrayIndexOutOfBoundsException();
        return top.data;
    }
 
    // 삭제연산
    public Object pop(){
        Object item = peek();
        top = top.nextNode;
        return item;
    }
cs


Integer 타입의 Stack 객체를 생성한 다음,

push 함수를 통해 10, 20, 30 순서로 넣어줍니다.

그리고 스택이 비어있지 않으면 pop 함수를 통해 삭제해주는 코드입니다.


'Programming > Data Structure' 카테고리의 다른 글

JAVA의 Tree  (1) 2016.03.13
JAVA의 Queue  (0) 2016.03.11
JAVA의 LinkedList  (0) 2016.02.20
JAVA의 ArrayList  (0) 2016.02.20
JAVA의 Collection, Map  (0) 2016.02.17
Comments