๊ฐœ์ธ ๊ณต๋ถ€ ๊ณผ์ •์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ What I Will Learn

  • ์Šคํƒ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ฐœ๋…๊ณผ ํ™œ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ธฐ
  • C์–ธ์–ด๋ฅผ ์ด์šฉํ•ด ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌํ˜„ํ•˜๊ธฐ


์Šคํƒ(Stack)

1๏ธโƒฃ ์Šคํƒ๋ž€?

  1. ์Šคํƒ์€ ํ•œ์ชฝ์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ ํ•œ์ชฝ์œผ๋กœ ๋‚˜์˜ค๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
  2. ์ˆ˜์‹ ๊ณ„์‚ฐ ๋“ฑ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๋‹ค๋ฐฉ๋ฉด์œผ๋กœ ํ™œ์šฉ๋œ๋‹ค
  • PUSH: ์Šคํƒ์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
  • POP: ์Šคํƒ์— ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ



2๏ธโƒฃ ์Šคํƒ์˜ ๊ตฌํ˜„

  1. ์Šคํƒ์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์—๋Š”
  • ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๊ณผ
  • ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค
  1. ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ๊ตฌํ˜„ ๋‚œ์ด๋„๋Š” ๋‚ฎ์€ํŽธ


โœ”๏ธ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ ๊ตฌํ˜„

1) ์Šคํƒ ์„ ์–ธ

#include <stdio.h>
#define SIZE 10000    // ์Šคํƒ ํฌ๊ธฐ
#define INF 99999999  //

int stack[SIZE]; // ์Šคํƒ ํฌ๊ธฐ ์„ ์–ธ
int top = -1;


2) ์Šคํƒ ์‚ฝ์ž… ํ•จ์ˆ˜

void push(int data) {
  if (top == SIZE - 1) {
	printf("์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.\n");
	return;
  }
  stack[++top] = data;
}


3) ์Šคํƒ ์ถ”์ถœ ํ•จ์ˆ˜

int pop() {
  if (top == -1) {
	printf("์Šคํƒ ์–ธ๋”ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.\n");
	return -INF;
  }
  return stack[top--];
}


4) ์Šคํƒ ์ „์ฒด ์ถœ๋ ฅ ํ•จ์ˆ˜

void show() {
  printf("--- ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ---\n");
	for (int i = top; i >= 0; i--) {
    	  printf("%d\n", stack[i]);
  	}
  printf("--- ์Šคํƒ์˜ ์ตœํ•˜๋‹จ ---\n");
}


5) ์™„์„ฑ๋œ ์Šคํƒ ์‚ฌ์šฉํ•˜๊ธฐ

int main(void) {
  push(7);
  push(5);
  push(4);
  pop();
  push(6);
  pop();
  show();
  system("pause");
  return 0;
}



โœ”๏ธ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ์Šคํƒ ๊ตฌํ˜„

1) ์Šคํƒ ์„ ์–ธ

#include <stdio.h>
#include <stdlib.h>
#define INF 99999999

typedef struct {
  int data;
  struct Node *next;
} Node;
typedef struct {
  Node *top;
} Stack;


2) ์Šคํƒ ์‚ฝ์ž… ํ•จ์ˆ˜

void push(Stack *stack, int data) {
  Node *node = (Node*) malloc(sizeof(Node)); node->data = data;
  node->next = stack->top;
  stack->top = node;
}


3) ์Šคํƒ ์ถ”์ถœ ํ•จ์ˆ˜

int pop(Stack *stack) {
  if (stack->top == NULL) {
	printf("์Šคํƒ ์–ธ๋”ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.\n");
        return -INF;
  }
  Node *node = stack->top;
  int data = node->data;
  stack->top = node->next;
  free(node);
  return data;
}


4) ์Šคํƒ ์ „์ฒด ์ถœ๋ ฅ ํ•จ์ˆ˜

void show(Stack *stack) {
  Node *cur = stack->top;
  printf("--- ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ---\n");

  while (cur != NULL) {
      printf("%d\n", cur->data);
      cur = cur->next;
  }
  printf("--- ์Šคํƒ์˜ ์ตœํ•˜๋‹จ ---\n");
}


5) ์™„์„ฑ๋œ ์Šคํƒ ์‚ฌ์šฉํ•˜๊ธฐ

int main(void) {
  Stack stack;
  stack.top = NULL;
  show(&stack);
  push(&stack, 7);
  push(&stack, 5);
  push(&stack, 4);
  pop(&stack);
  push(&stack, 6);
  pop(&stack);
  show(&stack);
  system("pause");
  return 0;
}




โœจ tl;dr

  • ์Šคํƒ์€ ๋ฐฐ์—ด ํ˜น์€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค