728x90
1. Stack 구현
1.1. Stack의 개념
Stack은 후입선출(LIFO, Last In First Out) 방식의 자료구조로, 마지막에 삽입된 요소가 가장 먼저 삭제됩니다. 일상적인 예로는 책 더미를 생각할 수 있습니다. 책을 하나씩 쌓을 때, 맨 위에 쌓은 책을 먼저 꺼내게 되죠.
1.2. 구현 방법
배열을 사용하여 Stack을 구현할 수 있습니다. 배열을 사용하면 고정 크기의 Stack을 만들 수 있으며, Stack의 삽입(push), 삭제(pop), 확인(peek) 연산을 구현할 수 있습니다.
1.3. Stack의 기능
push(value): Stack에 값을 추가.
pop(): Stack에서 값을 제거하고 반환.
peek(): Stack의 맨 위 값을 확인(삭제하지 않음).
isEmpty(): Stack이 비었는지 확인.
isFull(): Stack이 꽉 찼는지 확인.
1.4. Stack의 장점과 단점
장점:
구현이 간단하고, 후입선출(LIFO) 방식의 특성 덕분에 재귀 호출이나 함수 호출 스택과 같은 시스템에서 널리 사용됨.
예를 들어 브라우저의 뒤로 가기나 수식 계산기에서 유용.
단점:
고정 크기 배열로 구현하면 크기 제한이 있으며, 배열의 크기를 초과할 수 없다.
메모리 관리 측면에서 효율성이 떨어질 수 있음.
1.5. Stack 예시
// Stack 클래스 구현 (배열 기반)
class Stack {
private int maxSize;
private int top;
private int[] stackArray;
// Stack 생성자
public Stack(int size) {
maxSize = size;
stackArray = new int[size];
top = -1; // Stack이 비어있으면 top은 -1
}
// Stack이 비어있는지 확인
public boolean isEmpty() {
return top == -1;
}
// Stack이 꽉 찼는지 확인
public boolean isFull() {
return top == maxSize - 1;
}
// Stack에 데이터 푸시
public void push(int value) {
if (isFull()) {
System.out.println("Stack is full. Cannot push " + value);
} else {
stackArray[++top] = value; // top을 증가시킨 후 값을 삽입
System.out.println(value + " pushed to stack");
}
}
// Stack에서 데이터 팝
public int pop() {
if (isEmpty()) {
System.out.println("Stack is empty. Cannot pop");
return -1;
} else {
return stackArray[top--]; // top 값을 반환하고 top을 감소시킴
}
}
// Stack의 맨 위 값을 확인
public int peek() {
if (isEmpty()) {
System.out.println("Stack is empty. Cannot peek");
return -1;
} else {
return stackArray[top]; // 가장 최근에 푸시된 값 반환
}
}
}
public class Main {
public static void main(String[] args) {
Stack stack = new Stack(5); // Stack 크기 5로 생성
stack.push(10); // 10 푸시
stack.push(20); // 20 푸시
stack.push(30); // 30 푸시
stack.push(40); // 40 푸시
System.out.println("Top element is: " + stack.peek()); // Stack의 top 확인
System.out.println(stack.pop() + " popped from stack"); // 40 팝
System.out.println(stack.pop() + " popped from stack"); // 30 팝
System.out.println("Top element is: " + stack.peek()); // Stack의 top 확인
}
}
시연 결과
'Java' 카테고리의 다른 글
[JAVA] Callable과 Future로 비동기 작업 이해하기 (0) | 2025.04.03 |
---|---|
[Java] ScheduledExecutorService로 JVM 메모리 사용량 모니터링하기 (0) | 2025.04.02 |
[JAVA] HttpURLConnection을 활용한 HTTP 통신과 REST API 이해하기 (0) | 2025.03.27 |
[Java] nanoTime 사용해서 경과 시간 측정하기 (0) | 2025.03.26 |
[Java] Swing을 사용하여 간단한 계산기 만들기 (0) | 2025.03.24 |