스택코드

public class Stack
{
    private readonly int[] items;  //runtime 시점에 결정해서 수정 방지
    private int top = -1;
 
    // 생성자: 기본 크기 100
    public Stack(int size = 100)
    {
        items = new int[size];
    }
 
    // 속성으로 상태 확인
    public bool isEmpty => top == -1;  //람다식으로 top과 -1을 비교한 결과를 리턴
    public bool isFull => top == items.Length - 1;
    
    // 최상위 항목 확인
    public int peek()
    {
        if (isEmpty) throw new InvalidOperationException("Stack is empty");
        return items[top];
    }
 
    // 데이터 추가
    public void push(int item)
    {
        if (isFull) throw new StackOverflowException();
        items[++top] = item;
    }
 
    // 데이터 추출
    public int pop()
    {
        if (isEmpty) throw new InvalidOperationException("Stack is empty");
        return items[top--];
    }
 
    // 현재 스택 크기
    public int Count => top + 1;
    
}

예외 처리(throw new) 부분은 실제 프로그램 개발에 필수적이지만, 자료구조의 기본 원리를 배우는 단계에서는 무시하고 넘어간다.

실행코드

static void Main(string[] args)
{
    Stack stack = new Stack(5); // 크기 5로 생성
    
    Console.WriteLine($"스택이 비었나요? {stack.isEmpty}"); // True
 
    // 데이터 삽입
    for(int i=1; i<=5; i++){
        stack.push(i * 10);
        Console.WriteLine($"Push: {i*10}, Count: {stack.Count}");
    }
 
    // 최상단 값 확인
    Console.WriteLine($"Top 값: {stack.peek()}"); // 50
 
    // 데이터 꺼내기
    Console.WriteLine($"Pop: {stack.pop()}");
 
    // 데이터 123 넣기기
    stack.push(123);
    Console.WriteLine($"Push: {123}, Count: {stack.Count}");
 
    // 데이터 모두 꺼내기
    while(!stack.isEmpty){
        Console.WriteLine($"Pop: {stack.pop()}");
    }
 
    // 예외 처리 테스트
    try{
        stack.pop();
    }
    catch(InvalidOperationException ex){
        Console.WriteLine($"에러 발생: {ex.Message}");
    }
}

위에 만든 스택을 사용하기 위한 코드

결과화면

에러는 예외 처리(throw new) 를 하였기에 발생

Stack myStack = new Stack(5);

생성자를 통해 내부에 5개의 공간을 만든다. top이 -1로 현재 아무 정보도 없다.

top을 -1로 한 이유는 배열이 0부터 시작하기에 데이터가 1개 들어가면 -1+1 =0으로 0번배열부터 접근가능

stack.push(i * 10);

반복문을 이용하여 5개의 공간에 전부 채워 넣었을때 0번부터 순차적으로 데이터가 들어간다.

stack.pop()

데이터를 1개 꺼낸 상태이다 접근을 top을 이용하여 제어하기 때문에 top과 count 값만 줄어들었다.

{9A218E9C-D8F7-4BBE-B0DC-E8D0EA3A303D}.png

stack.push(123);

다시 데이터를 넣게 되면 이렇게 123이 들어간다.

working-of-stack.avif

위 이미지처럼 스택은 후입선출(LIFO, Last-In-First-Out) 구조로 가장 마지막에 삽입된 자료가 가장 먼저 삭제된다.