[c언어]알고리즘이 잘된건지좀 보고 리플좀..부탁.
글쓴이: lh8557 / 작성시간: 화, 2004/04/27 - 1:08오전
알고리즘은 자연어로 기술할께요.
중위연산자[infix]로 입력받아서 후위연산자[postfix]로 바까서
출력하고 후위연산자를 계산하여 값을 출력하는 계산기입니다.
거기에 ++ 연산자도 되게 포함했는데 값은나오는데
맞게 구현한건지 모르겠네요..리플좀부탁합니다.
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STACK_SIZE 100 /* 스택 최대 크기 */ #define MAX_EXPR_SIZE 100 /* 받는 문자열 최대 크기 */ typedef enum {lparen, rparen, plus, minus, times, divide, mod, rbig, lbig, not, equal, and, or, increase, eos, operand} precedence; int stack[MAX_STACK_SIZE]; char inexpr[MAX_EXPR_SIZE]; /* 중위 배열 */ char outexpr[MAX_EXPR_SIZE]; /* (중위 -->)후위 배열 */ void postfix(void); int eval(); static int isp[] = {0,19,12,12,13,13,13,10,10,15,9,5,4,15,0}; static int icp[] = {20,19,12,12,13,13,13,10,10,15,9,5,4,15,0}; void main(void) /* 중위식 후위식으로 변환/계산 */ { char c = 'y'; while(c=='y') { printf("Input the expression : "); scanf("%s", inexpr); postfix(); printf("%s\n",outexpr); printf("Evaluation Value : %d\n",eval()); printf("\nDo you want to do another expression('y'or'n')? "); scanf("%s", &c); } } char delete(int *top) { if(*top == -1) { printf("Stack Empty!!"); exit(1); } return stack[(*top)--]; } void add(int *top,int item) { if(*top == MAX_STACK_SIZE - 1) { printf("Stack Full!!"); exit(1); } stack[++*top] = item; } precedence get_token(char expr[],char *symbol, int *n) /* 중위식-후위식 토큰 */ { if(expr[*n] == '+' && expr[(*n)+1] == '+') // ++연산자를 a로 치환하기위해 ++연산자를 찾는과정 { expr[++(*n)]='\0'; // ++연산자를 찾았으면 공백를 줘서 다음에 a로 치환된 연산자를 읽음 return increase; } else *symbol = expr[(*n)++]; switch(*symbol) { case '(' : return lparen; case ')' : return rparen; case '+' : return plus; case '-' : return minus; case '/' : return divide; case '*' : return times; case '%' : return mod; case '\0': return eos; case '>' : return rbig; case '<' : return lbig; case '!' : return not; case '==': return equal; case '&&': return and; case '||': return or; case 'a' : return increase; default : return operand; } } char print_token(precedence deltop) /* 문자열 연산식을 기호로 바꾼다 */ { if(deltop == plus) return putchar('+'); else if (deltop == minus) return putchar('-'); else if (deltop == times) return putchar('*'); else if (deltop == divide) return putchar('/'); else if (deltop == mod) return putchar('%'); else if (deltop == increase) // 인크리즈가 get_token에서 리턴되면 a로 치환 return putchar('a'); } void postfix(void) /* 중위식(inexpr)을 후위식으로 바꾸고 outexpr 배열에 삽입 */ { char symbol; precedence token; int n = 0; int top = 0; int n2 = 0; /* outexpr을 하나씩 증가 시켜 후위식을 넣기 위한 변수 */ stack[0] = eos; for(token = get_token(inexpr,&symbol, &n); token != eos; token = get_token(inexpr,&symbol, &n)) { if(token == operand) outexpr[n2++] = symbol; else if(token == rparen) { while (stack[top] != lparen) outexpr[n2++] = print_token(delete(&top)); delete(&top); } else { while (isp[stack[top]]>=icp[token]) outexpr[n2++] = print_token(delete(&top)); add(&top,token); } } while((token = delete(&top)) != eos) /* 스택에 남은 나머지를 모두 빼서 outexpr에 넣는다 */ outexpr[n2++] = print_token(token); printf("\n"); } int eval() /* 후위식 계산 */ { precedence token; char symbol; int op1, op2; int n = 0; int top = -1; token = get_token(outexpr,&symbol, &n); while(token != eos) { if(token == operand) /* 토큰이 상수이면 ASKI Code '0'을 빼서 상수화한후에 삽입 */ add(&top, symbol-'0'); else if(token == increase)/*++연산자일경우*/ { op2 = delete(&top); op2 = op2 + 1; add(&top, op2); } else { op2 = delete(&top); /* 연산식이 나오면 스택 맨위(첫번째)에 상수값을 빼서 저장 */ op1 = delete(&top); /* 스택 맨위(두번째) 상수값을 뺀다 */ switch (token) /* op1과 op2를 계산 후 다시 스택에 쌓는다 */ { case plus: add(&top, op1+op2); break; case minus: add(&top, op1-op2); break; case times: add(&top, op1*op2); break; case divide: add(&top, op1/op2); break; case mod: add(&top, op1%op2); } } token = get_token(outexpr,&symbol, &n); } return delete(&top); }
Forums:
흐음..문제가 있군요...
우선 지금 보이는 건
이 두부분인데요.. 저런식으로 선언되어 있으면 문자열일텐데요.
차라리 토큰으로 다 짤려져 있다면 strcmp를 쓰는것도 좋지 않을까요?
galadriel in the tower of elves
Re: 흐음..문제가 있군요...
에러는 안 나나요? '==' 가 character 맞나요? case 다음에는 character 가 나와야 되는 것으로 알고 있었는데...
세벌 https://sebuls.blogspot.kr/
Re: 흐음..문제가 있군요...
warning이 뜨는데요...
test1.c:5: warning: multi-character character constant
이놈은 선언시에 뜨구요.
char c = '=='; 이런식으로 선언하거나 할때.
test1.c:5: warning: overflow in implicit constant conversion
이 워닝은 위에서 선언한 변수를 사용할때 뜹니다.
galadriel in the tower of elves
댓글 달기