通过后缀表达式模拟计算器

来源:互联网 发布:windows ndk下载 编辑:程序博客网 时间:2024/05/29 08:10

模拟栈 stack.h

#inndef _STACK_H#define _STACK_Htypedef char Bool;typedef int StackType;typedef struct stack stack;#define false 0#define true  1#define MAXSIZE 100struct stack{StackType buf[MAXSIZE];int top;};extern Bool isEmpty(stack *ps);extern Bool isFull(stack *ps);extern void initStack(stack *ps);extern Bool push(stack *ps,StackType data);extern Bool pop(stack *ps,StackType *pdata);#endif
stack.c

#include <stdio.h>#include "stack.h"Bool isEmpty(stack *ps){if(-1 == ps->top)return true;elsereturn false;}Bool isFull(stack *ps){if(MAXSIZE-1 == ps->top)return true;elsereturn false;}void initStack(stack *ps){ps->top = -1;}Bool push(stack *ps,StackType data){if(isFull(ps))return false;ps->buf[++(ps->top)] = data;return true;}Bool pop(stack *ps,StackType *pdata){if(isEmpty(ps))return false;*pdata = ps->buf[(ps->top)--];return true;}

calc.c

#include <stdio.h>#include "stack.h"void main(){struct stack s;initStack(&s);char opr[] = "32546*+*+41*+";int i=0;while('\0' != opr[i++]){//num pushif(opr[i]>='0' && opr[i]<='9'){if(!push(&s,(opr[i]-'0'))){printf("length not enough\n");return;}}//ch  pop two calc pushelse if('+'==opr[i] || '-' == opr[i] || '*' == opr[i] || '/' == opr[i]){int num1,num2;if(!pop(&s,&num1) || !pop(&s,&num2)){return;}int value;switch(opr[i]){case '+':value = num2+num1;break;case '-':value = num2-num1;break;case '*':value = num2*num1;break;case '/':value = num2/num1;break;}if(!push(&s,value)){printf("length not enough\n");return;}}else{printf(" input error\n");return;}}int ret;pop(&s,&ret);printf("%s = %d\n",opr,ret);}