스택코드
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 값만 줄어들었다.

stack.push(123);
다시 데이터를 넣게 되면 이렇게 123이 들어간다.
위 이미지처럼 스택은 후입선출(LIFO, Last-In-First-Out) 구조로 가장 마지막에 삽입된 자료가 가장 먼저 삭제된다.