Stack(1)

배지원·2022년 10월 19일
0

알고리즘

목록 보기
5/16

1. 정의

  • 한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out)형식의 자료 구조

2. 연산

  • pop( ) : 스택에서 가장 위에 있는 항목을 제거한다.
  • push(item) : item 하나를 스택의 가장 윗 부분에 추가한다.
  • peek( ) : 스택의 가장 위에 있는 항목을 반환한다.
  • isEmpty( ) : 스택이 비어 있을 때 true 반환한다.


3. 실습

1. Stack 클래스 사용 x

일반 클래스

public class stack {
    private Integer[] arr;      // 스택 저장하는 공간
    private int top = 0;        // 현재 스택 최고점 위치 나타냄

    public stack() {            // 생성자를 통해 배열의 크기를 초기화함
        this.arr = new Integer[10000];
    }

    public stack(int size) {
        this.arr = new Integer[10000];
    }

    public Integer[] getArr() {
        return arr;
    }

    public void push(int value) {
        // 10을 넣으면 arr[0] = 10
        this.arr[top++] = value;
    }

// 예외처리 전
//    public int pop() {
//        return this.arr[--this.top];
//    }

    public int pop() {
        if (this.isEmpty()) {
            throw new RuntimeException("스택이 비었습니다.");
        }
        return this.arr[--this.top];
    }

    public boolean isEmpty() {
        boolean isEmpty = this.top == 0;
        return isEmpty;
    }

    public int peek() {
        if (this.isEmpty()) {
            throw new EmptyStackException();
        }
        return this.arr[this.top - 1];
    }
}

TDD

class stackTest {
        stack st = new stack();

        @BeforeEach     // 무조건 제일 먼저 실행하고 시작함(공통값을 넣을때 주로 사용)
        void setUp() {  // 각 테스트가 실행되기 전에 실행되어 테스트별 구분함
            System.out.println("before each");
        }

        @Test
        @DisplayName("push가 잘되는지")
        void push(){
            st.push(10);
            st.push(20);
            Integer[] arr = st.getArr();

            assertEquals(20,arr[1]);
            assertEquals(10,arr[0]);
        }

        @Test
        void pushAndPop(){
            st.push(10);
            st.push(20);

            assertEquals(20, st.pop());
            assertEquals(10, st.pop());
            // st.pop() 비어 있을땐?
            // Exception 예외의 검증
            assertThrows(RuntimeException.class,()->{
                st.pop();
            });
//        st.pop();
        }

        @Test
        void isEmpty() {
            assertTrue(st.isEmpty());
            st.push(20);
            assertFalse(st.isEmpty());
            st.pop();
            assertTrue(st.isEmpty());
        }

        @Test
        void realStack() {
            // 자바 스택 구현채 (미리 해놓은거)
            Stack<Integer> st = new Stack<>();
            assertThrows(EmptyStackException.class, ()->{
                st.pop();
            });
//        st.pop();

        }

        @Test
        void peek() {
            stack st = new stack();
            // 스택이 비었는데 peek 할 때
            assertThrows(EmptyStackException.class,()->{
                st.peek();
            });
            st.push(10);
            int peeked = st.peek();
            assertEquals(10,peeked);
        }
}
profile
Web Developer

0개의 댓글