일반 클래스
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);
}
}