<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=%EC%8A%A4%ED%83%9D%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29</id>
	<title>스택(프로그래밍) - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=%EC%8A%A4%ED%83%9D%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29"/>
	<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=%EC%8A%A4%ED%83%9D(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)&amp;action=history"/>
	<updated>2026-07-06T20:00:15Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://www.gaonwiki.com/w/index.php?title=%EC%8A%A4%ED%83%9D(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)&amp;diff=107663&amp;oldid=prev</id>
		<title>Gaon12: 시작</title>
		<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=%EC%8A%A4%ED%83%9D(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)&amp;diff=107663&amp;oldid=prev"/>
		<updated>2024-10-14T02:26:28Z</updated>

		<summary type="html">&lt;p&gt;시작&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 개요 ==&lt;br /&gt;
스택(Stack)은 컴퓨터 과학에서 널리 사용되는 추상 자료형으로, 데이터를 저장하고 관리하는 자료 구조이다. 스택의 가장 큰 특징은 &amp;#039;후입선출&amp;#039;(LIFO: Last In First Out) 원칙을 따른다는 점이다. 이는 나중에 들어온 데이터가 가장 먼저 나가는 구조를 의미한다.&lt;br /&gt;
&lt;br /&gt;
== LIFO vs FIFO ==&lt;br /&gt;
데이터 구조를 이해하는 데 있어 LIFO와 FIFO의 개념은 매우 중요합니다.&lt;br /&gt;
&lt;br /&gt;
=== LIFO (Last In First Out) ===&lt;br /&gt;
* LIFO는 &amp;#039;&amp;#039;&amp;#039;&amp;quot;나중에 들어온 것이 먼저 나간다&amp;quot;&amp;#039;&amp;#039;&amp;#039;는 원칙이다.&lt;br /&gt;
* 스택(Stack)이 대표적인 LIFO 구조다.&lt;br /&gt;
* 실생활의 예: 접시 쌓기, 웹 브라우저의 뒤로 가기 버튼&lt;br /&gt;
&lt;br /&gt;
=== FIFO (First In First Out) ===&lt;br /&gt;
자세한 내용은 [[큐(프로그래밍)]] 문서를 참고하세요!&lt;br /&gt;
&lt;br /&gt;
* FIFO는 &amp;#039;&amp;#039;&amp;#039;&amp;quot;먼저 들어온 것이 먼저 나간다&amp;quot;&amp;#039;&amp;#039;&amp;#039;는 원칙이다.&lt;br /&gt;
* 큐(Queue)가 대표적인 FIFO 구조다.&lt;br /&gt;
* 실생활의 예: 계산대에 줄 서 있는 사람들, 프린터의 인쇄 대기열&lt;br /&gt;
&lt;br /&gt;
== 스택(Stack)의 특징 ==&lt;br /&gt;
# LIFO 원칙: 나중에 들어온 데이터가 가장 먼저 나간다.&lt;br /&gt;
# 주요 작업:&lt;br /&gt;
## Push: 스택의 위쪽(top)에 새로운 요소를 추가한다.&lt;br /&gt;
## Pop: 스택의 위쪽(top)에서 요소를 제거한다.&lt;br /&gt;
# 주요 위치:&lt;br /&gt;
## Top: 스택의 가장 위에 있는 요소의 위치&lt;br /&gt;
&lt;br /&gt;
== 스택의 기본 연산 ==&lt;br /&gt;
# push(item): 스택의 위쪽(top)에 새로운 요소를 추가한다.&lt;br /&gt;
# pop(): 스택의 위쪽(top)에서 요소를 제거하고 반환한다.&lt;br /&gt;
# peek(): 스택의 가장 위에 있는 요소를 반환하지만 제거하지는 않는다.&lt;br /&gt;
# isEmpty(): 스택이 비어있는지 확인한다.&lt;br /&gt;
# isFull(): 스택이 가득 찼는지 확인한다. (배열로 구현된 경우)&lt;br /&gt;
&lt;br /&gt;
== 스택의 구현 방식 ==&lt;br /&gt;
스택은 주로 두 가지 방식으로 구현된다:&lt;br /&gt;
&lt;br /&gt;
=== 1. 배열 기반 구현 ===&lt;br /&gt;
배열을 사용하여 스택을 구현하는 방식이다.&lt;br /&gt;
&lt;br /&gt;
==== 장점 ====&lt;br /&gt;
* 구현이 간단하다.&lt;br /&gt;
* 랜덤 접근이 가능하다.&lt;br /&gt;
&lt;br /&gt;
==== 단점 ====&lt;br /&gt;
* 크기가 고정되어 있어 스택이 가득 찼을 때 새로운 요소를 추가할 수 없다.&lt;br /&gt;
&lt;br /&gt;
==== C언어 예제 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#define MAX_SIZE 100&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    int items[MAX_SIZE];&lt;br /&gt;
    int top;&lt;br /&gt;
} Stack;&lt;br /&gt;
&lt;br /&gt;
void initializeStack(Stack *s) {&lt;br /&gt;
    s-&amp;gt;top = -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isEmpty(Stack *s) {&lt;br /&gt;
    return (s-&amp;gt;top == -1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isFull(Stack *s) {&lt;br /&gt;
    return (s-&amp;gt;top == MAX_SIZE - 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void push(Stack *s, int value) {&lt;br /&gt;
    if (isFull(s)) {&lt;br /&gt;
        printf(&amp;quot;Stack is full!\n&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    s-&amp;gt;items[++(s-&amp;gt;top)] = value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int pop(Stack *s) {&lt;br /&gt;
    if (isEmpty(s)) {&lt;br /&gt;
        printf(&amp;quot;Stack is empty!\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    return s-&amp;gt;items[(s-&amp;gt;top)--];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Stack s;&lt;br /&gt;
    initializeStack(&amp;amp;s);&lt;br /&gt;
&lt;br /&gt;
    push(&amp;amp;s, 10);&lt;br /&gt;
    push(&amp;amp;s, 20);&lt;br /&gt;
    push(&amp;amp;s, 30);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, pop(&amp;amp;s));&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, pop(&amp;amp;s));&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 연결 리스트 기반 구현 ===&lt;br /&gt;
연결 리스트를 사용하여 스택을 구현하는 방식이다.&lt;br /&gt;
&lt;br /&gt;
==== 장점 ====&lt;br /&gt;
* 크기가 동적으로 조절된다.&lt;br /&gt;
* 요소의 추가와 제거가 효율적이다.&lt;br /&gt;
&lt;br /&gt;
==== 단점 ====&lt;br /&gt;
* 추가적인 메모리가 필요하다. (포인터를 저장해야 하므로)&lt;br /&gt;
* 랜덤 접근이 불가능하다.&lt;br /&gt;
&lt;br /&gt;
==== C언어 예제 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct Node {&lt;br /&gt;
    int data;&lt;br /&gt;
    struct Node* next;&lt;br /&gt;
} Node;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    Node* top;&lt;br /&gt;
} Stack;&lt;br /&gt;
&lt;br /&gt;
void initializeStack(Stack* s) {&lt;br /&gt;
    s-&amp;gt;top = NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isEmpty(Stack* s) {&lt;br /&gt;
    return (s-&amp;gt;top == NULL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void push(Stack* s, int value) {&lt;br /&gt;
    Node* newNode = (Node*)malloc(sizeof(Node));&lt;br /&gt;
    newNode-&amp;gt;data = value;&lt;br /&gt;
    newNode-&amp;gt;next = s-&amp;gt;top;&lt;br /&gt;
    s-&amp;gt;top = newNode;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int pop(Stack* s) {&lt;br /&gt;
    if (isEmpty(s)) {&lt;br /&gt;
        printf(&amp;quot;Stack is empty!\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Node* temp = s-&amp;gt;top;&lt;br /&gt;
    int item = temp-&amp;gt;data;&lt;br /&gt;
    s-&amp;gt;top = s-&amp;gt;top-&amp;gt;next;&lt;br /&gt;
    free(temp);&lt;br /&gt;
&lt;br /&gt;
    return item;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Stack s;&lt;br /&gt;
    initializeStack(&amp;amp;s);&lt;br /&gt;
&lt;br /&gt;
    push(&amp;amp;s, 10);&lt;br /&gt;
    push(&amp;amp;s, 20);&lt;br /&gt;
    push(&amp;amp;s, 30);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, pop(&amp;amp;s));&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;, pop(&amp;amp;s));&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 스택의 응용 분야 ==&lt;br /&gt;
스택은 다양한 분야에서 활용된다:&lt;br /&gt;
&lt;br /&gt;
# 함수 호출의 관리 (호출 스택)&lt;br /&gt;
# 수식 계산 및 구문 분석&lt;br /&gt;
# 웹 브라우저의 뒤로 가기 기능&lt;br /&gt;
# 깊이 우선 탐색(DFS) 알고리즘&lt;br /&gt;
# 역순 문자열 만들기&lt;br /&gt;
# 운영 체제의 메모리 관리&lt;br /&gt;
&lt;br /&gt;
== 스택의 변형 ==&lt;br /&gt;
# 동적 스택(Dynamic Stack): 연결 리스트를 이용해 크기가 동적으로 조절되는 스택.&lt;br /&gt;
# 다중 스택(Multi Stack): 하나의 배열을 여러 개의 스택으로 나누어 사용하는 구조.&lt;br /&gt;
# 우선순위 스택(Priority Stack): 각 요소에 우선순위가 부여된 스택. (스택보다는 우선순위 큐에 가까운 개념)&lt;br /&gt;
&lt;br /&gt;
== 결론 ==&lt;br /&gt;
스택은 LIFO 원칙을 따르는 간단하면서도 강력한 자료 구조이다. 이 구조는 많은 실제 상황을 모델링하는 데 이상적이며, 컴퓨터 과학의 여러 분야에서 중요한 역할을 한다. 스택의 개념을 이해하고 적절히 활용할 수 있다면, 다양한 프로그래밍 문제를 효과적으로 해결할 수 있을 것이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--분류--&amp;gt;&lt;br /&gt;
[[분류:자료구조]] [[분류:알고리즘]] [[분류:컴퓨터 과학]]&lt;/div&gt;</summary>
		<author><name>Gaon12</name></author>
	</entry>
</feed>