후입선출(LIFO, Last In First Out) 방식으로 가장 나중에 들어온 데이터가 가장 먼저 나간다. 데이터를 삽입 삭제하는 연산이 한쪽에서만 진행된다.



public class Stack<T> {
private T[] stack;
private int top;
public Stack(int size) { // 정수를 전달받아 해당 크기의 배열 생성
stack = (T[]) new Object[size]; // 제네릭 타입은 배열로 직접 생성 불가
top = -1;
}
}
스택이 비어있는지 확인
public boolean isEmpty() {
return top == -1;
}
스택이 다 차있는지 확인
public boolean isFull() {
return top == stack.length -1;
}
스택 맨 위 요소 반환
public T peek() {
if(isEmpty()) {
System.out.println("스택이 비어 있습니다.");
return null;
}
return stack[top];
}
스택 맨 위에 요소 추가
public void push(T data) {
if(isFull()) {
System.out.println("스택이 가득 찼습니다.");
return;
}
top++;
stack[top] = data;
}
스택 맨 위 요소 제거 및 반환
public T pop() {
if(isEmpty()) {
System.out.println("스택이 비어 있습니다.");
return null;
}
T tmp = stack[top];
stack[top] = null;
top--;
return tmp;
}
스택의 모든 요소 출력
public void display() {
for (int i = 0; i <= top; i++) {
System.out.print(stack[i] + " ");
}
System.out.println();
}
Main
package stack;
public class Main {
public static void main(String[] args) {
// 스택 생성 (최대 5개 저장)
Stack<String> myStack = new Stack<>(5);
// push 테스트
myStack.push("A");
myStack.push("B");
myStack.push("C");
// display 테스트
System.out.print("현재 스택: ");
myStack.display(); // A B C
// peek 테스트
System.out.println("peek(): " + myStack.peek()); // C
// pop 테스트
System.out.println("pop(): " + myStack.pop()); // C 꺼냄
System.out.print("스택 상태: ");
myStack.display(); // A B
// push & isFull 테스트
myStack.push("D");
myStack.push("E");
myStack.push("F"); // 이제 가득 참
myStack.push("G"); // 스택이 가득 찼습니다.
System.out.print("최종 스택 상태: ");
myStack.display();
// 전부 pop 해보기
while (!myStack.isEmpty()) {
System.out.println("pop(): " + myStack.pop());
}
// 빈 스택 pop
myStack.pop(); // 스택이 비어 있습니다.
}
}
