๐ŸŒˆ ์ž๋ฃŒ๊ตฌ์กฐ:: ์Šคํƒ(Stack)

Aprilยท2021๋…„ 10์›” 17์ผ
0
post-thumbnail

๐Ÿš€ What I Will Learn

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


์Šคํƒ(Stack)

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

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

  • PUSH: ์Šคํƒ์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
  • POP: ์Šคํƒ์— ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ



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

1) ์Šคํƒ์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์—๋Š”

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

2) ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ๊ตฌํ˜„ ๋‚œ์ด๋„๋Š” ๋‚ฎ์€ํŽธ


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

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

  • ์Šคํƒ์€ ๋ฐฐ์—ด ํ˜น์€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค
profile
๐Ÿš€ ๋‚ด๊ฐ€ ๋ณด๋ ค๊ณ  ์“ฐ๋Š” ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ

0๊ฐœ์˜ ๋Œ“๊ธ€