๐ŸŒˆ ์ž๋ฃŒ๊ตฌ์กฐ:: ์Šคํƒ(Stack) ๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ

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

๐Ÿš€ What I Will Learn

  • ์Šคํƒ์„ ํ™œ์šฉํ•œ ๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ
    • ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•์„ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•œ๋‹ค
    • ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์„ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋„์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•œ๋‹ค

์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•์ด๋ž€? ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ์ด ์ˆ˜์‹์„ ํ‘œ๊ธฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‘œ๊ธฐ ๋ฐฉ๋ฒ•. ์˜ˆ์‹œ) 7 * 5 + 3

ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์ด๋ž€? ์ปดํ“จํ„ฐ๊ฐ€ ๊ณ„์‚ฐํ•˜๊ธฐ์— ํŽธํ•œ ์ˆ˜์‹์˜ ํ˜•ํƒœ. ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์—์„œ ์—ฐ์‚ฐ์ž๋Š” ๋’ค์ชฝ์— ์œ„์น˜. ์˜ˆ์‹œ) 7 5 * 3 +


์Šคํƒ(Stack)์„ ํ™œ์šฉํ•œ ๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ

โœ”๏ธ ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•์ด๋ž€?

1) ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ์ด ์ˆ˜์‹์„ ํ‘œ๊ธฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‘œ๊ธฐ ๋ฐฉ๋ฒ•

  • ์˜ˆ์‹œ) 7 * 5 + 3

โœ”๏ธ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์ด๋ž€?

1) ์ปดํ“จํ„ฐ๊ฐ€ ๊ณ„์‚ฐํ•˜๊ธฐ์— ํŽธํ•œ ์ˆ˜์‹์˜ ํ˜•ํƒœ
2) ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์—์„œ ์—ฐ์‚ฐ์ž๋Š” ๋’ค์ชฝ์— ์œ„์น˜

  • ์˜ˆ์‹œ) 7 5 * 3 +


1๏ธโƒฃ ์Šคํƒ์„ ํ™œ์šฉํ•ด ์ˆ˜์‹์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•

โœ”๏ธ ์Šคํƒ์„ ํ™œ์šฉํ•ด ์ˆ˜์‹์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•

1) ์ˆ˜์‹์„ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜
2) ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์„ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฒฐ๊ณผ ๋„์ถœ


โœ”๏ธ ์Šคํƒ์„ ํ™œ์šฉํ•ด ๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ1:: ์Šคํƒ ๊ตฌํ˜„

1) ์Šคํƒ ๊ตฌํ˜„

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>  // ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด
#define INF 99999999

typedef struct {  // ๊ตฌ์กฐ์ฒด ์ •์˜
  char data[100];
  struct Node *next;  // ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ ์–ธ
} Node;
typedef struct {
  Node *top;  // top pointer ์„ ์–ธ
} Stack;

2) ์Šคํƒ ํ•จ์ˆ˜ ๊ตฌํ˜„

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

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

โœ”๏ธ ์Šคํƒ์„ ํ™œ์šฉํ•ด ๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ2:: ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•์„ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

1) ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๋ฐ”๋กœ ์ถœ๋ ฅ
2) ์—ฐ์‚ฐ์ž๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์ž๊ธฐ๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ๋นผ๊ณ  ์ž์‹ ์„ ์Šคํƒ์— ๋‹ด๊ธฐ
3) ์—ฌ๋Š” ๊ด„ํ˜ธ (๋ฅผ ๋งŒ๋‚˜๋ฉด ๋ฌด์กฐ๊ฑด ์Šคํƒ์— ๋‹ด๊ธฐ
4) ๋‹ซ๋Š” ๊ด„ํ˜ธ )๋ฅผ ๋งŒ๋‚˜๋ฉด (๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์Šคํƒ์—์„œ ์ถœ๋ ฅ


3) ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜:: ์šฐ์„ ์ˆœ์œ„ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

int getPriority(char *i) {
  if (!strcmp(i, "(")) return 0;
  if (!strcmp(i, "+") || !strcmp(i, "-")) return 1; 
  if (!strcmp(i, "*") || !strcmp(i, "/")) return 2; return 3;
}

4) ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜:: ๋ณ€ํ™˜ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

char* transition(Stack *stack, char **s, int size) {
  char res[1000] = "";
  for (int i = 0; i < size; i++) {
    if (!strcmp(s[i], "+") || !strcmp(s[i], "-") || !strcmp(s[i], "*") || !strcmp(s[i], "/")) {
      while (stack->top != NULL && getPriority(getTop(stack)) >= getPriority(s[i])) {
        strcat(res, pop(stack)); strcat(res, " ");
      }
      push(stack, s[i]);
    }
    else if (!strcmp(s[i], "(")) push(stack, s[i]);
    else if (!strcmp(s[i], ")")) {
      while (strcmp(getTop(stack), "(")) {
        strcat(res, pop(stack)); strcat(res, " ");
      }
      pop(stack);
    }
    else strcat(res, s[i]); strcat(res, " ");
  }
  while (stack->top != NULL) {
    strcat(res, pop(stack)); strcat(res, " ");
  }
return res; 
}
 

โœ”๏ธ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•

1) ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์Šคํƒ์— ๋‹ด๊ธฐ
2) ์—ฐ์‚ฐ์ž๋ฅผ ๋งŒ๋‚˜๋ฉด ์Šคํƒ์—์„œ ๋‘ ๊ฐœ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ๊บผ๋‚ด์„œ ์—ฐ์‚ฐํ•œ ๋’ค์— ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์Šคํƒ์— ๋‹ด๊ธฐ
3) ์—ฐ์‚ฐ์„ ๋งˆ์นœ ๋’ค์— ์Šคํƒ์— ๋‚จ์•„์žˆ๋Š” ํ•˜๋‚˜์˜ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ

5) ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ• ๊ณ„์‚ฐ

void calculate(Stack *stack, char **s, int size) { 
  int x, y, z;
  for (int i = 0; i < size; i++) {
    if (!strcmp(s[i], "+") || !strcmp(s[i], "-") || !strcmp(s[i], "*") || !strcmp(s[i], "/")) { 
          x = atoi(pop(stack));
          y = atoi(pop(stack));
          if (!strcmp(s[i],
          if (!strcmp(s[i],
          if (!strcmp(s[i],
          if (!strcmp(s[i],
          char buffer[100];
          sprintf(buffer, "%d", z);
          push(stack, buffer);
    } else {
          push(stack, s[i]);
    }
  }
    printf("%s ", pop(stack));
}

6) ๋งŒ๋“ค์–ด์ง„ ๊ณ„์‚ฐ๊ธฐ ์‚ฌ์šฉํ•˜๊ธฐ 1

int main(void) {
  Stack stack;
  stack.top = NULL;
  char a[100] = "( ( 3 + 4 ) * 5 ) - 5 * 7 * 5 - 5 * 10";
  int size = 1;
  for (int i = 0; i < strlen(a); i++) {
    if (a[i] == ' ') size++;
  }
  char *ptr = strtok(a, " ");
  char **input = (char**)malloc(sizeof(char*) * size);
  for (int i = 0; i < size; i++) {
    input[i] = (char*)malloc(sizeof(char) * 100);
  }
  for (int i = 0; i < size; i++) {
    strcpy(input[i], ptr);
    ptr = strtok(NULL, " ");
  }
  char b[1000] = "";
  strcpy(b, transition(&stack, input, size)); 
  printf("ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•: %s\n", b); system("pause");
  return 0;
}

6) ๋งŒ๋“ค์–ด์ง„ ๊ณ„์‚ฐ๊ธฐ ์‚ฌ์šฉํ•˜๊ธฐ 2

size = 1;
for (int i = 0; i < strlen(b) - 1; i++) { // ๋งˆ์ง€๋ง‰์€ ํ•ญ์ƒ ๊ณต๋ฐฑ์ด ๋“ค์–ด๊ฐ€๋ฏ€๋กœ 1์„ ๋นผ๊ธฐ
  if (b[i] == ' ') size++;
}
char *ptr2 = strtok(b, " ");
for (int i = 0; i < size; i++) {
  strcpy(input[i], ptr2);
  ptr2 = strtok(NULL, " ");
}
calculate(&stack, input, size);
system("pause");
return 0;




โœจ tl;dr

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

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