스택은 말 그대로 “위로 쌓는 구조”입니다.
접시를 한 장씩 위로 쌓는 것처럼, 나중에 올라간 것이 먼저 나옵니다.
Push(10)
┌─────────┐
│ 10 │ ← Top
└─────────┘
Push(20)
┌─────────┐
│ 20 │ ← Top
├─────────┤
│ 10 │
└─────────┘
Push(30)
┌─────────┐
│ 30 │ ← Top
├─────────┤
│ 20 │
├─────────┤
│ 10 │
└─────────┘
Pop() → 30 제거
✔ Push = 스택의 맨 위에 올리기
✔ Pop = 스택의 맨 위에서 꺼내기
✔ Peek = 꺼내지 않고 맨 위 보기
아래 예제는 스택의 기본 동작인 Push / Pop / Peek을 순서대로 보여줍니다.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Stack stack = new Stack();
stack.Push(10);
stack.Push(20);
stack.Push(30);
Console.WriteLine("Peek: " + stack.Peek()); // 30
Console.WriteLine("Pop: " + stack.Pop()); // 30
Console.WriteLine("Peek: " + stack.Peek()); // 20
Console.WriteLine("Pop: " + stack.Pop()); // 20
Console.WriteLine("Count: " + stack.Count); // 1
}
}
출력 흐름:
Peek: 30
Pop: 30
Peek: 20
Pop: 20
Count: 1
아래는 위 코드가 실행될 때의 스택 변화 상황을 그림으로 표현한 것입니다.
Push(10)
┌─────────┐
│ 10 │
└─────────┘
Push(20)
┌─────────┐
│ 20 │ ← Top
├─────────┤
│ 10 │
└─────────┘
Push(30)
┌─────────┐
│ 30 │ ← Top
├─────────┤
│ 20 │
├─────────┤
│ 10 │
└─────────┘
Peek() → 30 (제거 안 함)
Pop() → 30 제거 후
┌─────────┐
│ 20 │ ← Top
├─────────┤
│ 10 │
└─────────┘
스택은 Undo 기능을 구현할 때 매우 유용합니다.
class Editor
{
private Stack<string> undoStack = new Stack<string>();
public void Type(string text)
{
undoStack.Push(text);
Console.WriteLine("입력: " + text);
}
public void Undo()
{
if (undoStack.Count == 0)
{
Console.WriteLine("Undo할 내용 없음");
return;
}
string removed = undoStack.Pop();
Console.WriteLine("Undo: " + removed);
}
}