후위표기법으로 변환해서 계산하는 프로그램을 코딩중에 문제가 발생했습니다.
조회수 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개가 있구요. 이것들 우선 수정하시고, 다시 하나하나 살펴 보셔야 할 것 같습니다. 행운을 빕니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력