πŸ“š Stack

hyukimΒ·2020λ…„ 5μ›” 5일
0

데이터ꡬ쑰둠

λͺ©λ‘ 보기
4/6

Stack

자료 ꡬ쑰 μ€‘μ—μ„œ 데이터와 링크둜 κ΅¬μ„±λœ μ—°κ²° 리슀트(Linked List)λΌλŠ” 것이 μžˆλ‹€. 이 μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ–΄λ–»κ²Œ ν™œμš©ν•˜μ—¬ λ§Œλ“œλŠλƒμ— λ”°λΌμ„œ μ—¬λŸ¬ 자료 ꡬ쑰λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. μ΄λ²ˆμ—” κ·Έ μ€‘μ—μ„œ Stack에 λŒ€ν•΄μ„œ μ–˜κΈ°ν•˜κ² λ‹€.

Stack(μŠ€νƒ)

  • λ¦¬μŠ€νŠΈν˜• 데이터 ꡬ쑰 μ€‘μ—μ„œ ν•œ μͺ½μ—μ„œλ§Œ 데이터λ₯Ό μΆ”κ°€ν•˜κ³  μ‚­μ œν•  수 μžˆλŠ” LIFO(Last In First Out; μ„ μž…ν›„μΆœ)식 데이터 ꡬ쑰이닀.
  • λ²½λŒμ„ μŒ“λŠ”κ²ƒ 처럼 ν‘œμ‹œν•˜μ—¬ κ°€μž₯ λ¨Όμ € λ“€μ–΄μ˜¨ 데이터λ₯Ό 밑에, κ°€μž₯ 늦게 λ“€μ–΄μ˜¨ 데이터λ₯Ό 제일 μœ„μ— μŒ“λŠ”λ‹€.
  • μŠ€νƒμ˜ 제일 μœ„λ₯Ό top, 제일 밑을 bottom이라고 ν•œλ‹€.

μŠ€νƒμ˜ κ΅¬ν˜„ μ’…λ₯˜

  • 배열을 ν™œμš©ν•œ μŠ€νƒ
    • 배열을 ν™œμš©ν•  μ‹œ κ³ μ • ν¬κΈ°μ΄λ―€λ‘œ 크기λ₯Ό λ²”μœ„λ₯Ό λ²—μ–΄λ‚  μˆ˜λ„ μžˆλ‹€.
      • 배열이 μ‚¬μš© κ°€λŠ₯ν•œ λ²”μœ„λ₯Ό 이상 ꡬ역을 μ ‘κ·Όν•˜λ €κ³  ν•  λ•Œ, Segmentation Faultκ°€ λ°œμƒν•˜λŠ”λ°, 이λ₯Ό μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš°(Stack Overflow)라고 ν•œλ‹€.
      • λ˜ν•œ λ²”μœ„ μ΄ν•˜μ˜ ꡬ역을 μ ‘κ·Όν•˜λ €κ³  ν• λ•Œ Segmentation Faultκ°€ λ°œμƒν•˜λ©΄, μŠ€νƒ μ–Έλ”ν”Œλ‘œμš°(Stack Underflow)라고 ν•œλ‹€.
  • λ§ν¬λ“œ 리슀트λ₯Ό ν™œμš©ν•œ μŠ€νƒ
    • κ°€λ³€ ν¬κΈ°μ΄λ―€λ‘œ μ™ λ§Œν•΄μ„œλŠ” 크기λ₯Ό 잘 λ²—μ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€.
    • ν•˜μ§€λ§Œ 전체 λ©”λͺ¨λ¦¬ 크기보닀 큰 λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ²Œ 되면 ν„°μ§ˆ μˆ˜λ„ μžˆλ‹€.
  • stack의 κ΅¬ν˜„ 방식에 따라 stack의 μ—°μ‚°λ“€μ˜ μ‹œκ°„ λ³΅μž‘λ„κ°€ 달라진닀!

μŠ€νƒμ˜ μ—°μ‚°

  • pop() : μŠ€νƒμ˜ κ°€μž₯ μœ„μ— μžˆλŠ” ν•­λͺ©μ„ μ œκ±°ν•œλ‹€.
  • push(item) : item ν•˜λ‚˜λ₯Ό μŠ€νƒμ˜ κ°€μž₯ μœ— 뢀뢄에 μΆ”κ°€ν•œλ‹€.
  • peek() : μŠ€νƒμ˜ κ°€μž₯ μœ„μ— μžˆλŠ” ν•­λͺ©μ„ λ¦¬ν„΄ν•œλ‹€.
  • is_empty() : μŠ€νƒμ΄ λΉ„μ–΄μžˆμœΌλ©΄ true(1)λ₯Ό λ¦¬ν„΄ν•œλ‹€.

μŠ€νƒμ˜ κ΅¬ν˜„

  • stack κ΅¬ν˜„
typedef struct s_stack
{
	int data;
	struct s_stack *next;
} t_stack;
  • pop() κ΅¬ν˜„
void pop(t_stack *stack)
{
	t_stack *node;
	t_stack *prev;

	if (!stack)
		return ;
	prev = stack;
	node = stack->next;
	while (node->next);
	{
		prev = node;
		node = node->next;
	}
	free(node);
	prev->next = NULL;
}
  • push(item) κ΅¬ν˜„
void push(t_stack *stack, int item)
{
	t_stack *node;
	t_stack *new;

	node = stack;
	if ((new = (t_stack *)malloc(sizeof(stack))) == 0)
		return ;
	new->data = item;
	new->next = NULL;
	while (node->next)
		node = node->next;
	node->next = new;
}
  • peek() κ΅¬ν˜„
int peek(t_stack *stack)
{
	t_stack *node;

	node = stack;
	while (node->next)
		node = node->next;
	return (node->data);
}
  • is_empty() κ΅¬ν˜„
int is_empty(t_stack *stack)
{
	if (stack == NULL)
		return (1);
	return (stack->next == NULL);
}
  • main μ˜ˆμ‹œ
#include "stack.h"

int main(void)
{
	t_stack *stack;

	stack = (t_stack *)malloc(sizeof(t_stack));
	for (int i = 0; i < 5; i++)
		push(stack, i);
	while (!is_empty(stack))
	{
		printf("%d ", stack.peek());
		pop(stack);
	}
	return (0);
}
// result
// 4 3 2 1 0
profile
πŸ’ͺ πŸ₯© 🍺 ✈ πŸ’»

0개의 λŒ“κΈ€