#include<stdio.h>


#define MAX 100

int j;

int top = -1;

int stack[MAX];

char expr[MAX];

int isp[] = { 0,19,12,12,13,13,13,0 };

int icp[] = { 20,19,12,12,13,13,13,0 };

typedef enum { lparen, rparen, plus, minus, times, divide, mod, eos, operand }precedence;


void printToken(precedence);

void postfix();

int eval();

precedence getToken(char* , int*);

void push(int );

int pop();

void is_full();

void is_empty();


int main()

{

FILE* fp = fopen(fname, "r");;

char name[100];


while (1) {

printf("파일이름은? : ");

scanf("%s", name);



fgets(stack, MAX_STACK_SIZE, fp);

fclose(fp);


printf(" 후위연산 -> ");

postfix();

printf(" 연산결과 -> %d\n", eval());

}

printf("프로그램 종료");

}

}


precedence getToken(char* symbol, int* n)

{

*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' ':return eos;

default: return operand;

}

}


void is_full()

{

if (top == MAX - 1)

printf("FULL");

}

void is_empty()

{

if (top == -1)

printf("EMPTY");

}

void push(int data)

{

if (!is_full)

stack[++top] = data;

else

printf("FULL");

}

int pop()

{

if (!is_empty)

return stack[top--] ;

else

printf("EMPTY");

}

int eval()

{

precedence token;

char symbol;

int op1, op2;

int n = 0;

token = getToken(&symbol, &n);

while (token != eos)

{

if (token == operand)

push(symbol - '0');

else

{

op2 = pop();

op1 = pop();


switch (token)

{

case plus:push(op1 + op2);

break;

case minus:push(op1 - op2);

break;

case times: push(op1 * op2);

break;

case divide:push(op1 / op2);

break;

case mod:push(op1 % op2);


}

}

token = getToken(&symbol, &n);

}

return pop();

}



void postfix()

{

char symbol;

precedence token;

int n = 0;

stack[0] = eos;


for (token == getToken(&symbol, &n); token != eos; token == getToken(&symbol, &n))

{

if (token == operand)

printf("%c", symbol);

else if (token == rparen)

{

while (stack[top] != lparen)

printToken(pop());

pop();

}

else

{

while (isp[stack[top]] >= icp[token])

printToken(pop());

push(token);

}

}

while (token = pop() != eos)

printToken(token);


printf("\n");

}


void printToken(precedence token)

{

switch (token)

{

case lparen: expr[j++] = '(';

break;

case rparen: expr[j++] = '(';

break;

case plus: expr[j++] = +'+';

break;

case minus: expr[j++] = -'-';

break;

case divide: expr[j++] = '/';

break;

case times: expr[j++] = '*';

break;

case mod: expr[j++] = '%';

break;


case eos: expr[j++] = ' ';

return;

expr[j++] = ' ';

}



LNK2019뜨는데 아 함수선언하고 구현도다했는데 왜이레ㅐ