C++고수님들.. C초보입니다.. 이해하기쉽게 주석좀 부탁드릴게요..
#include"stdio.h"
#define MAX_STACK_SIZE 100 // 스택최대크기
#define MAX_EXPR_SIZE 100 // 수식최대크기
void postfix(void);
int cal(void);
typedef enum {lparen, rparen, plus, minus, times, divide, mod, eos, operand} precedence;
int stack[MAX_STACK_SIZE];
char iexpr[MAX_EXPR_SIZE];
char pexpr[MAX_EXPR_SIZE];
int isp[]={0, 19, 12, 12, 13, 13, 13, 0};
int icp[]={20, 19, 12, 12, 13, 13, 13, 0};
main()
{
printf("Input the expression : ");
gets(iexpr);
postfix();
puts(pexpr);
printf("Evaluation Value : %d\n", cal());
}
int delete(int *top)
{
int token;
if (*top == -1) {
printf("Stack is empty. \n");
exit(1);
}
token = stack[(*top)]; (*top)--; return token;
// return stack[(*top)--];
}
void add(int *top, int item)
{
if (*top >= MAX_STACK_SIZE-1) {
printf("Stack is full. \n");
exit(1);
}
++(*top); stack[*top] = item;
// stack[++*top] = item;
}
void print_token(precedence token, int *p)
{
if (token == plus) pexpr[(*p)++]='+';
else if (token == minus) pexpr[(*p)++]='-';
else if (token == times) pexpr[(*p)++]='*';
else if (token == divide) pexpr[(*p)++]='/';
else if (token == mod) pexpr[(*p)++]='%';
}
precedence get_token(char expr[], char *symbol, int *n)
{
*symbol = expr[(*n)++];
switch (*symbol) {
case '(' : return lparen;
case ')' : return rparen;
case '+' : return plus;
case '-' : return minus;
case '*' : return times;
case '/' : return divide;
case '%' : return mod;
case '\0' : return eos;
default : return operand;
}
}
void postfix(void)
{
char symbol;
precedence token;
int n = 0;
int top = 0;
int p=0;
stack[0] = eos;
for (token=get_token(iexpr,&symbol,&n); token != eos; token=get_token(iexpr, &symbol,&n) ) {
if (token == operand)
pexpr[p++]=symbol;
else if (token == rparen) {
// 왼쪽 괄호가 나올때까지 스택안의 토큰들을 출력시킨다.
while (stack[top] != lparen)
print_token(delete(&top), &p);
delete(&top); //왼쪽 괄호를 버란다.
}
else {
while (isp[stack[top]] >= icp[token]) print_token(delete(&top), &p);
add(&top, token);
}
}
while ((token=delete(&top)) != eos) print_token(token, &p);
pexpr[p]='\0';
}
int cal(void)
{
/* 전역변수로 되어 있는 후위표기식 pexpr을 연산한다.
'\0'은 수식의 끝을 나타낸다.
stack과 top은 전역변수이다.
함수 get_token은 토큰의 타입과 문자 심벌을 반환한다.
피연산자는 한 문자로 된 숫자임을 가정한다. */
precedence token;
char symbol;
int op1, op2;
int n=0; //수식문자열을 위한 카운터
int top = -1;
token = get_token(pexpr, &symbol, &n);
while (token != eos) {
if (token == operand)
add(&top, symbol-'0'); // 스택에 삽입
else {
// 피연산자를 삭제하여 연산을 수행한 후, 그 결과를 스택에 삽입한다.
op2 = delete(&top);
op1 = delete(&top);
switch (token) {
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);
} // switch
} // else
token = get_token(pexpr, &symbol, &n);
}
return delete(&top); //결과 반환
}
-
가능한 상세하게 부탁드려요..
아 이 소스는 중위 표기에서 후위 표기로 만든 소스입니다.
과제이시나 본데..
역폴란드 표기법 때문에 스택 쓰시는 것 같은데.. 스택을 이용해서 중위식을 후위식으로 표현하는 알고리즘은 구글링만 해도 인터넷에 나와있습니다.
직접 공부하시길 바랍니다.
이런..
여기는 과제를 해주는 곳이 아닙니다.. 공부하다 막히는 곳이 있을 때 물어보는 곳이죠
뭘 가능한 상세하게 부탁하는지 모르겠지만 적어도 스스로 공부하실꺼면, 소스 분석하다 모르는 부분을 물어보셔야지 이렇게 통째로 묻는건 좀 아니라고 보네요
저런..
공감합니다.
공부할 맘이 없으시면 숙제 대행사이트 알아보시는것도
댓글 달기