후위표기법으로 변환해서 계산하는 프로그램을 코딩중에 문제가 발생했습니다.

조회수 397회
#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;
} Stack;

//스택 구현하기 - 스택 함수 구현하기
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;
}

//후위 표기법으로 변환 - 우선순위 함수 만들기
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;
}

//후위 표기법으로 변환 - 변환 함수 만들기
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;
}

//후위 표기법 계산
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], "+")) z = y + x;
            if (!strcmp(s[i], "-")) z = y - x;
            if (!strcmp(s[i], "*")) z = y * x;
            if (!strcmp(s[i], "/")) z = y / x;
            char buffer[100];
            sprintf(buffer, "%d", z);
            push(stack, buffer);
        }
        else {
            push(stack, s[i]);
        }
    }
    printf("%s ", pop(stack));
}

//만들어진 계산기 사용하기
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);
    size = 1;
    for (int i = 0; i < strlen(b) - 1; i++) {
        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;
}

여기에서 main함수에서

for (int i = 0; i < size; i++) {
        strcpy(input[i], ptr2);//이부분에서 예외가 발생합니다.
        ptr2 = strtok(NULL, " ");
    }

위의 주석처럼 저부분에서 예외가 발생한다고 합니다. 후위표기법으로 변환은 잘 실행되는데 계산부분에서 에러가 계속나네요ㅜㅜ 도와주시면 감사하겠습니다!

1 답변

  • 눈에 보이는 에러가 있는 곳을 우선 적겠습니다.

    typedef struct {
        char data[100];
        struct Node* next;
    } Node;
    

    이것이 우선 잘못 됬구요.

    typedef struct node{
        char data[100];
        struct node* next;
    } Node;
    

    이런 식으로 고쳐야 하고요.

    또,

    char* pop(Stack* stack) {
        if (stack->top == NULL) {
            printf("스택 언더플로우가 발생했습니다.\n");
            return -INF;
        }
    

    여기도 잘못 됬구요.

    char* pop(Stack* stack) {
        if (stack->top == NULL) {
            printf("스택 언더플로우가 발생했습니다.\n");
            exit(-INF);
        }
    

    이런 식으로 고쳐야 합니다.

    또,

    char* transition(Stack* stack, char** s, int size) {
        char res[1000] = "";
    

    여기도 잘못 됬습니다.

    char* transition(Stack* stack, char** s, int size) {
        char* res = (char*)malloc(1000 * sizeof(char));
    

    이런 식으로 고쳐야 합니다.

    우선 에러가 이렇게 3개가 있구요. 이것들 우선 수정하시고, 다시 하나하나 살펴 보셔야 할 것 같습니다. 행운을 빕니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 제가 적은 코드로 dev-C++에선 작동하는데 왜 visual studio에선 오류가 나는 걸까요..?ㅠㅠ galaxykim 2020.10.19 07:16

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)