#include <stdio.h>
#define MAX_STACK_SIZE 100
#define MAX_EXPR_SIZE 100
typedef struct{
int key;
}element;
element stack[MAX_STACK_SIZE];
int top = -1;
//스택으로의 삽입함수
void add(int* top, element item)
{
//전역 stack에 item을 삽입
if(*top>=MAX_STACK_SIZE-1){
stack_full();
return ;
}
stack[++*top] = item;
}
//스택으로부터 삭제함수
element delete(int *top)
{
if(*top == -1)
return stack_empty();
return stack[(*top)--];
}
/*-------------------------------------------------------------------------------*/
typedef enum {
lparen, rparen, plus, minus, times, divide, mod, eos, operand
}percedence;
int stack[MAX_STACK_SIZE];
char expr[MAX_EXPR_SIZE];
//후위표기식 함수
int eval()
{/*전역 변수로 되어있는 후위표기식 expr을 연산한다.\0은 수식의 끝을 나타낸다.stack과top은 전역변수이다
함수get_token은 토큰의 타입과 문자 심벌을 반환한다.피연산자는 한 문자로 된 숫자임을 가정한다.*/
precedence token;
char symbol;
int op1,op2;
int n=0; //수식 문자열을 위한 카운터
int top = -1;
token = get_token(&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); break;
}
}
token = get_token(&symbol,&n)
}
return delete(&top);//결과를 반환
}
precedence get_token(char* symbol, int* n)
{/*다음 토큰을 취한다. symbol은 문자표현이며 token은 그것의 열거된 값으로 표현되고 명칭으로 반환된다*/
*symbol = expr[(*n)++];
switch(*symbol){
case '(' :return lparen;
case ')' :return rparen;
case '+' :return plus;
case '-' :return miuns;
case '/' :return divide;
case '*' :return times;
case '%' :return mod;
case '\0':return eos;
default :return operand;//오류검사는 하지 않고 기본값은 피연산자
}
}