IT

후위식변환2

kio467 2014. 6. 9. 11:13

//후위식계산

/* DBLAB postfixeval.c */

#include <stdio.h>

#include <math.h>

#include <string.h>

#define MAX_STACK_SIZE 100 /* maximum stack size */

#define MAX_EXPR_SIZE 100 /* max size of expression */


typedef enum {lparen, rparen, plus, minus, times, divide, 

mod, eos, operand } precedence;


char expr[MAX_EXPR_SIZE]; /* input string */

int top = -1;


int stack[MAX_STACK_SIZE];

/* isp and icp arrays ? index is value of precedence lparen, rparen, 

plus, minus, times, divide, mode, eos */


void push(int item) 

{

  if(top >= MAX_STACK_SIZE - 1) {

    printf("stack_full()\n");

    return;

  }

  stack[++top] = item;

}                    


int pop() {

if(top == -1)

printf("stack_empty()\n"); exit();

}

return stack[(top)--];

}


int isempty()

{ if( top == -1 ) return(1); else return(0); }


int isfull()

{ if ( top >= MAX_STACK_SIZE -1 ) return(1); else return(0); }

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

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


precedence get_token(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;

  }

}


precedence print_token(precedence  t) {

  switch(t) {

case lparen : printf("(" ); break;

case rparen : printf(")" ); break;

case plus : printf("+" ); break;

case minus : printf("-" ); break;

case divide : printf("/" ); break;

case times : printf("*" ); break;

case mod : printf("%" ); break;

case eos : printf("eos" ); break;

default: printf("\n");

  }

}


int eval(void) 

{

  precedence token;

  char symbol;

  int op1, op2;

  int n = 0;

  top = -1;

  token = get_token(&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 = get_token(&symbol, &n);

   }

  return pop();

}


int main()

{

strcpy(expr, "32+ ");

  printf("* Begin evaluation ... %s\n", expr);   

printf("* The result is => %d\n", eval());

}