이근λ‘₯
κ·Όλ‘₯이의 λΈ”λ‘œκ·Έ
이근λ‘₯
전체 방문자
859,614
였늘
22
μ–΄μ œ
424

곡지사항

  • 전체보기 (107)
    • μ›Ή (9)
    • μ–Έμ–΄ & ν”„λ ˆμž„μ›Œν¬ (53)
      • JavaScript (7)
      • TypeScript (0)
      • Node.js (11)
      • Vue.js (3)
      • React (0)
      • React Native (0)
      • C & C++ (19)
      • Java & JSP (9)
      • Python (4)
    • 컴퓨터 κ³Όν•™ (3)
      • μ•Œκ³ λ¦¬μ¦˜ (0)
      • 자료ꡬ쑰 (3)
    • 기타 (9)
      • Linux (1)
      • Git (2)
      • DialogFlow (4)
    • 일상 (13)
      • κ²Œμž„ (13)
    • 칼럼 (9)
      • 회고 (0)
      • λ‚˜λ§Œμ˜ κΈ€ (0)
      • μ œν’ˆ 리뷰 (9)
    • __Dev__ (9)
      • Release (9)
λ°˜μ‘ν˜•

인기 κΈ€

  • μ›Ή ν‘Έμ‹œ μ•Œλ¦Ό(Web Push Notification)
    2022.06.13
    μ›Ή ν‘Έμ‹œ μ•Œλ¦Ό(Web Push Notification)
  • [Tomcat] μ•„νŒŒμΉ˜ ν†°μΊ£ μ„œλ²„ 포트 λ³€κ²½ν•˜κΈ°
    2018.08.24
    [Tomcat] μ•„νŒŒμΉ˜ ν†°μΊ£ μ„œλ²„ 포트 λ³€κ²½ν•˜κΈ°
  • [Node.js] μ‹€μ‹œκ°„ μ±„νŒ… μ„œλΉ„μŠ€ λ§Œλ“€κΈ°(5) - μ±„νŒ…β‹―
    2018.05.31
    [Node.js] μ‹€μ‹œκ°„ μ±„νŒ… μ„œλΉ„μŠ€ λ§Œλ“€κΈ°(5) - μ±„νŒ…β‹―
  • [Vue 3] Composition API μ‚΄νŽ΄λ³΄κΈ°
    2020.03.04
    [Vue 3] Composition API μ‚΄νŽ΄λ³΄κΈ°
  • [Vue 3] Composition API와 ν…œν”Œλ¦Ώ μ°Έμ‘°(β‹―
    2020.10.02
    [Vue 3] Composition API와 ν…œν”Œλ¦Ώ μ°Έμ‘°(β‹―

νƒœκ·Έ

  • μ΄νŽ™νŠΈ
  • Scanner
  • νŒŒν‹°ν΄
  • vue.js
  • AstroWar
  • Hello World!
  • Java FX
  • javascript
  • Composition API
  • WWDC
  • Deemo
  • μ›Ή ν™•μž₯
  • pwa
  • 이클립슀
  • μžλ°”
  • ν”„λ‘œκ·Έλ ˆμ‹œλΈŒ μ›Ή μ•±
  • Vue 3
  • μ „κ°œ ꡬ문
  • vue
  • WWDC20
  • composition-api
  • vue3
  • μžλ°” ν”„λ‘œμ νŠΈ
  • vue-next
  • ES6
  • vuex
  • μΆœκ°„
  • spread syntax
  • java
  • self

졜근 λŒ“κΈ€

  • μ»€μ„œ μœ„μΉ˜μ΄λ™ ν•¨μˆ˜κΉŒμ§€ ν–ˆλŠ”λ° μ»΄νŒŒμΌν•˜λ©΄ Makefile.β‹―
    Qour94
  • iOS의 경우 μ• ν”Œμ—μ„œ κ°œλ°œν•˜κ³  μžˆλŠ” webkit 엔진을 β‹―
    이근λ‘₯
  • android, IOSμ—μ„œ λœλ‹€κ³  ν–ˆλŠ”λ° Notificaβ‹―
    μ‚½μžλ£¨λΆ€λŒ€
  • λ©”μΈν•¨μˆ˜μ— 쑰건문을 λΆ™μ˜€λŠ”λ°λ„ 메뉴 ν™”λ©΄λ§Œ λ¬΄ν•œ λ°˜λ³΅λ©λ‹ˆβ‹―
    μ•Œλ €μ£Όμ„Έμš₯
  • "첫 λ°©λ¬Έλ•ŒλŠ” μ„œλΉ„μŠ€μ›Œμ»€ 등둝, 캐싱 λ“± μž‘μ—…μ„ μ§„ν–‰ν•˜μ§€λ§Œβ‹―
    이근λ‘₯

졜근 κΈ€

  • μ›Ή ν‘Έμ‹œ μ•Œλ¦Ό(Web Push Notification)
    2022.06.13
    μ›Ή ν‘Έμ‹œ μ•Œλ¦Ό(Web Push Notification)
  • μŠ€νƒ(Stack)
    2022.05.26
    μŠ€νƒ(Stack)
  • λ°°μ—΄(Array)
    2022.05.25
    λ°°μ—΄(Array)
  • Cμ–Έμ–΄λ‘œ λ°°μš°λŠ” 자료ꡬ쑰
    2022.05.24
    Cμ–Έμ–΄λ‘œ λ°°μš°λŠ” 자료ꡬ쑰
  • [Vue 3] Composition API와 ν…œν”Œλ¦Ώ μ°Έμ‘°(β‹―
    2020.10.02
    [Vue 3] Composition API와 ν…œν”Œλ¦Ώ μ°Έμ‘°(β‹―

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • λ―Έλ””μ–΄λ‘œκ·Έ
  • λ°©λͺ…둝
hELLO Β· Designed By μ •μƒμš°.
이근λ‘₯

κ·Όλ‘₯이의 λΈ”λ‘œκ·Έ

μŠ€νƒ(Stack)
컴퓨터 κ³Όν•™/자료ꡬ쑰

μŠ€νƒ(Stack)

2022. 5. 26. 00:49
λ°˜μ‘ν˜•

 


πŸ’‘ μ •μ˜

μŠ€νƒμ€ ν•œμͺ½μœΌλ‘œλ§Œ 데이터λ₯Ό λ„£κ³  λΊ„ 수 μžˆλŠ” ν˜•νƒœμ˜ 데이터 ꡬ쑰둜, ν›„μž… μ„ μΆœ(Last In First Out, LIFO)μ΄λΌλŠ” νŠΉμ„±μ„ μ§€λ‹ˆκ³  μžˆλ‹€.

차곑차곑 μŒ“μ—¬ μžˆλŠ” ν˜•νƒœμ˜ 데이터 ꡬ쑰라고 보면 λœλ‹€.

🌱 ADT

μŠ€νƒ(Stack)


μŠ€νƒμ€ κ·Έλ¦Όκ³Ό 같이 ν•œμͺ½μœΌλ‘œλ§Œ 데이터λ₯Ό λ„£κ³ (push), λΊ„(pop) 수 μžˆλ‹€. μŠ€νƒμ€ 일반적으둜 자료λ₯Ό λ„£κ³  λΉΌλŠ” κ²ƒλΏλ§Œ μ•„λ‹ˆλΌ κ°€μž₯ μœ„μ— μžˆλŠ” 자료λ₯Ό 확인(peek)ν•˜κ±°λ‚˜, μŠ€νƒμ΄ λΉ„μ–΄(isEmpty)μžˆλŠ”μ§€ 확인할 수 μžˆλ‹€.

μŠ€νƒμ— ν•„μš”ν•œ κΈ°λŠ₯듀이 μ–΄λŠ 정도 λ‚˜μ—΄λ˜μ—ˆλŠ”λ°, 좔상 μžλ£Œν˜•μ„ κ°„λž΅ν•˜κ²Œ μ½”λ“œλ‘œ ν‘œν˜„ν•΄λ³΄μž.

Stack<T> {
  push(T);
  pop();
  peek();
  isEmpty();
}

μ–΄λŠ 정도 μ •λ¦¬λ˜μ—ˆμœΌλ‹ˆ 이λ₯Ό Cμ–Έμ–΄λ‘œ κ΅¬ν˜„ν•΄λ³΄μž.

πŸ‘€ μŠ€νƒ μ‚΄νŽ΄λ³΄κΈ°

μŠ€νƒμ„ κ΅¬ν˜„ν•  수 μžˆλŠ” 방법은 μ—¬λŸ¬ κ°€μ§€κ°€ μžˆμ§€λ§Œ 이번 κΈ€μ—μ„œλŠ” λ°°μ—΄(Array)을 ν™œμš©ν•˜μ—¬ μŠ€νƒμ„ κ΅¬ν˜„ν•˜λ €κ³  ν•œλ‹€. μ•„λž˜ 예제 μ½”λ“œλ₯Ό ν™•μΈν•΄λ³΄μž.

#define STACK_SIZE 10

int top = -1;
int stack[STACK_SIZE];

STACK_SIZE λΌλŠ” 맀크둜λ₯Ό μ •μ˜ν–ˆλ‹€.

μŠ€νƒμ˜ 크기λ₯Ό 10으둜 μ •μ˜ν•  것이기 λ•Œλ¬Έμ— 10μ΄λΌλŠ” κ°’μœΌλ‘œ μ§€μ •ν•΄μ£Όμ—ˆλ‹€.

top μ΄λΌλŠ” μ •μˆ˜ν˜• λ³€μˆ˜μ™€ stack μ΄λΌλŠ” μ΄λ¦„μ˜ 배열이 μ„ μ–Έλ˜μ–΄μžˆλ‹€. μš©λ„λŠ” μ•„λž˜μ™€ κ°™λ‹€.

  • top: μŠ€νƒ μ΅œμƒλ‹¨ 자료의 μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜
  • stack: 자료λ₯Ό μ €μž₯ν•  λ°°μ—΄ (μŠ€νƒ 곡간)


top 의 초기 값이 -1인 μ΄μœ λŠ” 아직 μŠ€νƒμ΄ λΉ„μ–΄μžˆκΈ° λ•Œλ¬Έμ΄λ‹€. 즉 -1은 λΉ„μ–΄μžˆλ‹€(empty)λΌλŠ” 의미둜 받아듀이렀고 ν•œλ‹€. λ¨Όμ € 기본적으둜 데이터λ₯Ό λ„£κ³ , λΊ„ 수 μžˆλŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•΄λ³΄μž.

void push(int);
int pop(void);

void push(int data)
{
  // λ°°μ—΄ μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘μ΄λ―€λ‘œ, STACK_SIZE - 1
  if (top >= STACK_SIZE - 1)
  {
    printf("꽉 μ°Όλ‹€!");
    return;
  }
  stack[++top] = data;
}

int pop(void)
{
  if (isEmpty())
  {
    printf("ν…… λΉ„μ–΄μžˆλ„€");
    return 0;
  }
  return stack[top--];
}

데이터λ₯Ό λ„£κ³  λΊ„ λ•Œ μŠ€νƒμ΄ 가득 μ°ΌλŠ”μ§€, μ•„λ‹ˆλ©΄ λΉ„μ–΄μžˆλŠ”μ§€ 확인할 수 μžˆλ„λ‘ 쑰건이 μΆ”κ°€λ˜μ–΄μžˆλ‹€.

μ—¬κΈ°μ„œ 주의 깊게 봐야 ν•  뢀뢄은 top λ³€μˆ˜ κ°’μ˜ 변화이닀.
push ν•¨μˆ˜μ—μ„œλŠ” μ„ μœ„ μ¦κ°€λ˜κ³  있고, pop μ—μ„œλŠ” ν›„μœ„ κ°μ†Œλ˜κ³  μžˆλ‹€.

자료λ₯Ό λ„£κΈ° μœ„ν•΄μ„  미리 μœ„μΉ˜κ°€ μ •ν•΄μ Έ μžˆμ–΄μ•Ό ν•˜κ³ , λ°˜λŒ€λ‘œ λΊ„ λ•Œμ—λŠ” μžλ£Œκ°€ λ‚˜μ˜¨ ν›„ μ΅œμƒμœ„ μœ„μΉ˜κ°€ λ‹€μ‹œ κ³„μ‚°λ˜μ–΄μ•Ό ν•œλ‹€.

우리 μΌμƒμ—μ„œ μƒˆλ‘œμš΄ μ§‘μœΌλ‘œ 이사간닀고 μƒκ°ν•˜λ©΄ μ΄ν•΄ν•˜κΈ° μ‰¬μšΈ 것이닀. (λ¨Όμ € 집을 κ΅¬ν•œ λ’€ λ“€μ–΄κ°€κ³ , λ‚˜μ˜¬ λ•Œμ—λŠ” 정리 λ¨Όμ € ν•œ ν›„ 방을 λΊ€λ‹€)

자료λ₯Ό λ„£κ³  λΉΌλŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν–ˆμœΌλ‹ˆ, μ΄λ²ˆμ—λŠ” λ‚˜λ¨Έμ§€ 두 κΈ°λŠ₯(peek, isEmpty)을 κ΅¬ν˜„ν•΄λ³΄μž.

int peek(void):
int isEmpty(void);

int peek(void)
{
  if (isEmpty())
  {
    printf("μŠ€νƒμ΄ λΉ„μ–΄μžˆμ–΄μš”");
    return 0;
  }
  return stack[top];
}

int isEmpty(void)
{
  return top == -1 ? 1 : 0;
}

peek은 ν˜„μž¬ μŠ€νƒ μ΅œμƒλ‹¨μ— μ–΄λ–€ 값이 μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ”μ§€ ν™•μΈν•˜κ³ , λΉ„μ–΄μžˆμ§€ μ•Šμ„ 경우 stack[top] μœ„μΉ˜μ— μžˆλŠ” 값을 μ „λ‹¬ν•΄μ£ΌκΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

isEmptyλŠ” μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
μš°λ¦¬λŠ” top 값이 -1 일 λ•Œ μŠ€νƒμ΄ λΉ„μ–΄μžˆλ‹€κ³  νŒλ‹¨ν•˜κΈ°λ‘œ ν–ˆμœΌλ‹ˆ 이에 맞게 쑰건을 μΆ”κ°€ν–ˆλ‹€.

-1인 경우 1(μ°Έ)을 λ°˜ν™˜ν•˜κ³ , -1이 μ•„λ‹Œ 경우 0(κ±°μ§“)을 λ°˜ν™˜ν•˜λ„λ‘ ν–ˆλ‹€.

 

μ΄λ ‡κ²Œ μŠ€νƒμ˜ κΈ°λ³Έ κΈ°λŠ₯을 λͺ¨λ‘ κ΅¬ν˜„ν•΄λ³΄μ•˜λ‹€.

μŠ€νƒμ— λ‹΄κ²¨μ ΈμžˆλŠ” 값을 확인할 수 μžˆλ„λ‘ μ•„λž˜μ™€ 같은 ν•¨μˆ˜λ₯Ό μΆ”κ°€λ‘œ κ΅¬ν˜„ν•˜κ³ ,  직접 μŠ€νƒμ„ μ‚¬μš©ν•΄λ³΄λ©° λ™μž‘ν•˜λŠ” λͺ¨μŠ΅μ„ ν™•μΈν•΄λ³΄μž.

void printStack(void);

// μŠ€νƒ κ°’ 확인을 μœ„ν•œ ν•¨μˆ˜
void printStack(void) {
  if (isEmpty())
  {
    printf("[]\n");
    return;
  }

  printf("[ ");
  for (int i = 0; i < STACK_SIZE; i++)
  {
    if (i <= top)
    {
      printf("%d ", stack[i]);
    }
    else
    {
      printf("- ");
    }
  }
  printf("]\n");
}

 

#include <stdio.h>

#define STACK_SIZE 10

int top = -1;
int stack[STACK_SIZE];

void push(int);
int pop(void);
int peek(void);
int isEmpty(void);
void printStack(void);

void push(int data)
{
  // λ°°μ—΄ μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘μ΄λ―€λ‘œ, STACK_SIZE - 1
  if (top >= STACK_SIZE - 1)
  {
    printf("꽉 μ°Όλ‹€!");
    return;
  }
  stack[++top] = data;
}

int pop(void)
{
  if (isEmpty())
  {
    printf("ν…… λΉ„μ–΄μžˆλ„€");
    return 0;
  }
  return stack[top--];
}

int peek(void)
{
  if (isEmpty())
  {
    printf("μŠ€νƒμ΄ λΉ„μ–΄μžˆμ–΄μš”");
    return 0;
  }
  return stack[top];
}

int isEmpty(void)
{
  return top == -1 ? 1 : 0;
}

// μŠ€νƒ κ°’ 확인을 μœ„ν•œ ν•¨μˆ˜
void printStack(void) {
  if (isEmpty())
  {
    printf("[]\n");
    return;
  }

  printf("[ ");
  for (int i = 0; i < STACK_SIZE; i++)
  {
    if (i <= top)
    {
      printf("%d ", stack[i]);
    }
    else
    {
      printf("- ");
    }
  }
  printf("]\n");
}

int main(void)
{
  push(4);
  push(-102);
  push(23);
  push(9);
  push(10);
  printStack();

  int popValue = pop();
  printf("pop: %d\n", popValue);

  int peekValue = peek();
  printf("peek: %d\n", peekValue);

  pop();
  pop();
  printStack();

  return 0;
}

/*
Result
[ 4 -102 23 9 10 - - - - - ]
pop: 10
peek: 9
[ 4 -102 - - - - - - - - ]
*/

메인 ν•¨μˆ˜λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ μŠ€νƒμ— 4, -102, 23, 9, 10 값을 넣은 ν›„ μŠ€νƒ 값을 좜λ ₯ν•˜λ‹ˆ μ°¨λ‘€λŒ€λ‘œ 값이 μŠ€νƒμ— λ“€μ–΄κ°€ μžˆλŠ” 것을 λ³Ό 수 μžˆλ‹€.

 

이후 값을 κΊΌλ‚Έ ν›„ ν•΄λ‹Ή 값을 좜λ ₯해보고 μžˆλ‹€. κ°€μž₯ λ§ˆμ§€λ§‰μ— push ν•œ 값은 10이기 λ•Œλ¬Έμ— ν•΄λ‹Ή 값이 λ¨Όμ € κΊΌλ‚΄μ‘Œλ‹€. (ν›„μž…μ„ μΆœ)

 

값이 κΊΌλ‚΄μ§„ μƒνƒœμ—μ„œ κ°€μž₯ μœ„μ— μžˆλŠ” 값을 좜λ ₯(peek)해보면 이전에 λ„£μ—ˆλ˜ 값인 9λ₯Ό 확인할 수 μžˆλ‹€.

 

λ§ˆμ§€λ§‰μœΌλ‘œ 값을 2개 더 μŠ€νƒμ—μ„œ κΊΌλ‚Έ λ’€ μŠ€νƒ λ‚΄λΆ€λ₯Ό 보면 λ‚˜λ¨Έμ§€ 두 개의 값을 확인할 수 μžˆλ‹€.


μ§€κΈˆκΉŒμ§€ μŠ€νƒμ— λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜λ‹€.

 

μŠ€νƒ μžλ£Œκ΅¬μ‘°λŠ” μž¬κ·€ μ•Œκ³ λ¦¬μ¦˜μ—μ„œ 널리 μ‚¬μš©ν•˜κΈ°λ„ ν•˜κ³ , λͺ‡λͺ‡ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ λ™μž‘μ„ μ‚΄νŽ΄λ³΄λ©΄ 콜 μŠ€νƒ(Call stack)μ΄λΌλŠ” κ°œλ…μ΄ μ‘΄μž¬ν•˜κΈ°λ„ ν•œλ‹€.

 

μŠ€νƒμ΄λΌλŠ” κ°œλ…μ„ 잘 μˆ™μ§€ν•˜λ„λ‘ ν•˜μž.

λ°˜μ‘ν˜•
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ 동일쑰건
    '컴퓨터 κ³Όν•™/자료ꡬ쑰' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • λ°°μ—΄(Array)
    • Cμ–Έμ–΄λ‘œ λ°°μš°λŠ” 자료ꡬ쑰
    이근λ‘₯
    이근λ‘₯
    μƒˆλ‘œμš΄ 것을 μ’‹μ•„ν•˜λŠ” ν”„λ‘ νŠΈμ—”λ“œ 개발자 ✨
    λŒ“κΈ€μ“°κΈ°

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”