배열로 구현한 Stack
import java.util.Arrays;
import java.util.Stack;
public class MyStack {
Stack stack = new Stack();
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private int[] element;
private int size;
MyStack() {
element = new int[10];
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
private void resize(int minCapacity) {
int oldCapacity = element.length;
int newCapacity = oldCapacity * 2;
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
element = Arrays.copyOf(element, newCapacity);
}
void push(int data) {
if (size + 1 - element.length > 0)
resize(size + 1);
element[size++] = data;
}
int pop() {
int result = -1;
if (size < 0) return result;
else {
result = element[--size];
System.arraycopy(element, size+1, element, size, 1);
element[size] = -1;
return result;
}
}
int getSize() {
return this.size;
}
}
Node로 구현한 Stack
import java.util.Arrays;
public class MyStack2<E> {
private Node<E> head;
private Node<E> tail;
private int size;
static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(E element) {
this.item = element;
}
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
MyStack2() {
}
void push(int data) {
Node<E> prev = tail;
Node<E> node = new Node(prev, data, null);
tail = node;
if (prev == null)
head = node;
else
prev.next = node;
size++;
}
int pop() {
if (size == 0) return -1;
else {
int result = (int) tail.item;
final Node<E> prev = tail.prev;
Node<E> beforeTail = tail;
beforeTail.item = null;
beforeTail.prev = null;
tail = prev;
if (tail == null) {
head = null;
} else {
prev.next = null;
}
size--;
return result;
}
}
int getSize() {
return this.size;
}
}
테스트 코드
import static org.junit.Assert.assertEquals;
import org.junit.jupiter.api.Test;
class TestMyStack {
MyStack stack = new MyStack();
MyStack2<Integer> stack2 = new MyStack2<Integer>();
@Test
void pushTest() {
stack.push(1);
stack.push(2);
stack.push(3);
assertEquals(stack.getSize(), 3);
assertEquals(stack.pop(), 3);
assertEquals(stack.pop(), 2);
}
@Test
void pushTest2() {
stack2.push(1);
stack2.push(2);
stack2.push(3);
assertEquals(stack2.getSize(), 3);
assertEquals(stack2.pop(), 3);
}
}
'Development > Java' 카테고리의 다른 글
[white ship - 4주차] 제어자 - Queue의 add vs offer의 차이는? (0) | 2024.01.26 |
---|---|
[white ship - 4주차] 제어자 - 과제 1. live-study 대시 보드를 만드는 코드를 작성하세요. - 객체지향 관점에서 리팩토링하기 (1) | 2024.01.26 |
[white ship - 4주차] 제어자 - 과제 2. LinkedList를 공부하세요. (0) | 2024.01.23 |
[white ship - 4주차] 제어자 - 과제 1. live-study 대시 보드를 만드는 코드를 작성하세요. (0) | 2024.01.22 |
[white ship - 3주차] 연산자 (0) | 2024.01.14 |