티스토리 뷰

🧩 자바

[Data Structure] 스택

홓옇 2023. 1. 31. 15:52

스택은 삽입과 삭제가 한쪽 끝 top에서만 이루어지는 유한 순서 리스트이며 주로 사용하는 함수가 push, pop이기에 pushdown 리스트라고도 한다.

스택은 LIFO(Last In First Out) 방식이기 때문에 스택을 역순으로 만드는데 유용하다.

스택 ADT

ADT Stack
데이타 : 0개 이상의 원소를 가진 유한 순서 리스트
연산 :
    stack ∈ Stack; 
    item ∈ Element;
    createStack() ::= create an empty stack;

    push(stack, item) ::= insert item onto the top of the stack;

    isEmpty(stack) ::= if (stack is empty) then return true
    else return false;

    pop(stack) ::= if (isEmpty(stack)) then return null
    else { delete and return the top item of stack };

    delete(stack) ::= if (isEmpty(stack)) then return error    
    else delete the top item;

    peek(stack) ::= if (isEmpty(Stack)) then return error
    else return (the top item of stack);
End Stack

stack 생성자

stack 배열과 top 변수를 두어 스택의 top원소를 가리키게 한다. 스택을 생성하면 top = -1 로 초기화 시킨다.
top = -1 이라면 공백 스택임을 표시한다.

class Stack {
    private String stack[];
    private int top;
    public Stack(int n) {
        stack = new String[n];
        top = -1;
    }

isEmpty 연산자

top이 -1이라면 공백 스택임을 표시하는 것이기 때문에 top 변수안에 들어있는 값으로 스택이 비어있는지 확인할 수 있다.

public boolean isEmpty() {
    return (top < 0);
}

push 연산자

새로운 원소가 들어가면 top을 증가시키고 만약 top이 stack 배열크기보다 크다면 인덱스초과에러를 발생시킨다.

public void push(String item) {
    if (top >= stack.length) 
        throw new IndexOutOfBoundsException();
    top++;
    stack[top] = item;
}

pop 연산자

top이 0보다 작다면 스택이 비어있기 때문에 인덱스에러를 발생시키고 그렇지 않다면 top에 담겨있는 원소를 리턴하고 top을 1감소 시킨다.

public String pop() {
    if (top < 0) throw new IndexOutOfBoundsException();
    String item = stack[top];
    top--;
    return item;
}

peek 연산자

pop연산자와 다른 점은 연산을 실행 후 그 원소를 배열내에서 없애지만 peek연산자는 top에 있는 원소를 리턴해주기만 한다.

public String peek() {
    if (top < 0) throw new IndexOutOfBoundsException();
    return stack[top];
}

delete 연산자

pop연산자와 다른점은 top 원소를 리턴하면서 원소를 삭제시킨다면 delete는 원소를 리턴하지 않고 삭제시킨다.

public void delete() {
    if (top < 0) 
        throw new IndexOutOfBoundsException();
    top--;
}

연결 리스트를 이용한 스택

연결 리스트로 표현된 연결 스택으로 생각할 수 있다.

public class ListStack implements Stack {
    class ListNode {
        Object data;
        ListNode link;
    }

    private ListNode top;
    public boolean isEmpty() { // 스택이 공백인가를 검사
        return (top == null);
    }
    public void push(Object x) { // 스택에 원소 x를 삽입
        ListNode newNode = new ListNode();
        newNode.data = x;
        newNode.link = top;
        top = newNode;
    }
    27 public Object pop() { // 스택의 원소를 삭제하여 반환
        if (isEmpty()) 
            return null; // 공백인 경우
        else {
            Object item = top.data;
            top = top.link;
            return item;
        }
    }
    public void delete() { // 연결 스택의 top 원소를 삭제
        if (isEmpty()) 
            return;
        else 
            top = top.link;
        }
    public Object peek() { // 스택의 top 원소를 검색
        if (isEmpty()) 
            return null;
        else 
            return top.data;
        }
    }

'🧩 자바' 카테고리의 다른 글

BFS, DFS  (0) 2023.05.16
[Data Structure] 큐  (0) 2023.02.01
[Data Structure] 단순 연결 리스트  (0) 2023.01.26
Algorithm, Notation  (1) 2023.01.25
[Data Structure] 배열  (1) 2023.01.18
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함