表达式求值源代码

/*小弟刚学c数据结构 这是清华大学严蔚敏数据结构那本书上的用堆栈实现的 自己写的不好的地方 各位大哥恳请指教用#做为表达式结束符*/ #include #define STACK_SIZE 100

#define STACKINCREMENT 10

#define elemtype char

 typedef struct{ elemtype *base; elemtype *top; int stacksize; }*ptstack,sqstack;

 

 void initstack(ptstack s )

 { s->base=(elemtype *)malloc(STACK_SIZE*sizeof(elemtype)); s->top=s->base; s->stacksize=STACK_SIZE; }

 

int stackempty(ptstack s) {

if(s->base==s->top) return 1; else return 0;

}

 void push(ptstack s,elemtype e) {

if(s->top-s->base>=s->stacksize) {

s->base=(elemtype *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(elemtype)); s->top=s->base+s->stacksize; s->stacksize+=STACKINCREMENT; } *s->top++=e;

}

 

 elemtype pop(ptstack s) {elemtype e; e=*--s->top; return e; }

 

elemtype gettop(ptstack s) {elemtype e; e=*(s->top-1); return e; }

 #define elemtype2 int typedef struct{elemtype2 *base; elemtype2 *top; int stacksize; }*ptstack2,sqstack2;

 

 void initstack2(ptstack2 s ) { s->base=(elemtype2 *)malloc(STACK_SIZE*sizeof(elemtype2));

 s->top=s->base; s->stacksize=STACK_SIZE; }

 

int stackempty2(ptstack2 s) { if(s->base==s->top) return 1; else return 0; }

void push2(ptstack2 s,elemtype2 e) {if(s->top-s->base>=s->stacksize) {s->base=(elemtype2 *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(elemtype2)); s->top=s->base+s->stacksize; s->stacksize+=STACKINCREMENT; } *s->top++=e; }

elemtype2 pop2(ptstack2 s) {elemtype2 e; e=*--s->top; return e; }

elemtype2 gettop2(ptstack2 s) {elemtype2 e; e=*(s->top-1); return e; }

 

 int in(char c) { switch(c) { case '+': return 0; case '-': return 1; case '*': return 2; case '/': return 3; case '(': return 4; case ')': return 5; case '#':return 6; default:return 7; } }

 static char youxian[7][7]= { {'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=',' '}, {'>','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='} };

 elemtype2 t=0; int chartoint(char c){int i; i=(int)c-48; return i; }

 char precede(char c,char d) { int m,n; m=in(c); n=in(d); return youxian[m][n]; }

 

int operate(int a,char c,int b){ switch(c){case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; } }

int fourf() {char c,theta;

elemtype2 m,a,b;

ptstack OPTR; ptstack2 OPND;

initstack(OPTR);push(OPTR,'#'); initstack2(OPND);c=getchar(); while(c!='#'||gettop(OPTR)!='#'){ if(in(c)==7){ while(in(c)==7){m=chartoint(c);t=t*10+m; c=getchar();} push2(OPND,t);t=0;} else switch(precede(gettop(OPTR),c)) {case '<':push(OPTR,c);c=getchar(); break; case '=':;pop(OPTR);c=getchar(); break; case '>': theta=pop(OPTR); b=pop2(OPND);a=pop2(OPND); push2(OPND,operate(a,theta,b)); break; case ' ': printf("error"); break; } } return gettop2(OPND); }

 

 

 main() { printf("%d",fourf()); getch();

 

 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值