20230512

아홍·2023년 5월 12일

2023.05

목록 보기
9/19

자료 구조 중에 stack과 queue를 배웠다.
둘 다 개념 자체는 별 거 아닌데, 이걸 응용해서 문제풀기가.. 어렵지.
보면 항상 그래. 개념 자체는 별 거 아니야. 문제 해결이 문제지.
아니다, 내가 문젠가ㅋㅋㅋㅋㅋ


자료 구조 : 데이터를 효율적으로 다룰 수 있는 방법들
각 자료 구조는 특정한 상황에 특화되어있다
내가 해결할 문제에 어떤 자료구조를 채택하여 문제를 해결할 것인가! 를 위해 자료구조를 공부하는 것


Stack : 데이터를 순서대로 "쌓는다"
Last In First Out

push() : 데이터 넣기
pop() : 마지막에 넣은 데이터를 리턴하고 스택에서 삭제
peek() : 마지막에 넣은 데이터 리턴
empty() : boolean 리턴
search(o) : o가 스택에 없다면 -1리턴, 있다면 얼마나 멀리 있는지 int로 리턴

        Stack<Integer> stack = new Stack<>();

        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4); //{1, 2, 3, 4}

        System.out.println(stack.pop());//4
        System.out.println(stack.search(1));
        //3, 현재 스택은 {1, 2, 3}, 1을 꺼내려면 pop을 3번 해야한다, 이렇게 이해하면 되나?
        System.out.println(stack.pop());//3
        System.out.println(stack.pop());//2

        System.out.println(stack.empty());//false

        System.out.println(stack.pop());//1

        System.out.println(stack.empty());//true

Stack의 장점
-데이터를 삽입, 삭제할 때 모든 데이터를 순회할 필요가 없기 때문에 데이터를 가져오는 속도가 빠르다
-자바에서 스택을 기본 자료 구조로 제고아기 때문에 별도의 라이브러리나 모듈을 설치할 필요가 없다

자바에서 Stack의 단점
-크기 제한이 없다. 이를 피하려면 스택의 크기를 미리 정하거나 동적으로 조절해야 한다.
-Vector 클래스를 상속받아 구현되어 있다. >처음에 지정된 크기만큼만 할당되고, 크기가 초과되면 새로 할당하고 기존 데이터를 복사한다. >크기가 자주 변하는 스택은 다른 구조를 쓰는게 효율적
-Vector를 상속받아 구현되어 있어 vector의 모든 메서드를 사용할 수 있다 > 중간 삽입, 삭제 등 의도된 동작을 방해할 수 있어 주의를 요한다.

LIFO 깊이 들어가려면 Deque 인터페이스 보라고 공식문서가 학습방향도 알려주네... 좀있다가 봐야지


Queue는 First In First Out
게임할 때 큐 생각하면 될듯

queue의 요소 추가는 add(), offer()이 있다.
offer()는 넣을 자리가 없으면 false를 리턴하고 add()는 예외를 발생시킨다. 즉, offer()는 예외처리 안해도 된다
나머지 메서드들도 마찬가지

Throws exceptionReturn special value
insertaddoffer
removeremovepoll
examineelementpeek

Queue 의 장점
-처리해야 할 작업이 여러 개 있을 경우, 차례대로, 효율적인 처리가 가능하다.
-삽입, 삭제가 빠르다
-자바에서 기본 자료구조로 제공한다

자바에서 Queue의 단점
-중간 삽입, 삭제, 조회에는 적합하지 않다
-크기 제한이 없어서 메모리 낭비가 발생할 수 있다.
-iterator()가 지원되지 않는다
-큐가 중복 객체를 허용할 경우, remove(o)의 동작이 불명확하다.

+원형 큐 공부하란다..... deque랑 같이 봐야겠다....


0개의 댓글