#include <stdio.h>
#include <stdlib.h> //为了能使用atof()函数,将字符串s转换成相应的浮点数
//书上P64页的逆波兰计算器,每个操作数都被依次压入栈中,当一个运算符到达时,从栈中弹出相应数目的操作数,运算完的结果压入栈中
#define MAXOP 100 //操作符和运算符的最大长度
#define NUMBER '0' //标识找到的一个数
int getop(char []);
void push(double);
double pop(void);
main()
{
int type; //可以是数,可以是运算符
double op2,op1;
char s[MAXOP];
while((type=getop(s))!=EOF)
{
switch(type)
{
//是数的情况
case NUMBER:
push(atof(s)); //若getop读取的是数,用atof将字符串转换成浮点数
break;
//是运算符的情况
case '+': //其他操作符如果只输入一个数字便紧接操作符,则执行的是:0 操作符 输入数字
push(pop()+pop());
break;
case '*':
push(pop()*pop());
break;
case '-': //为什么可以有负数呢,因为值栈中如果没有push任何元素,栈底默认元素为0,pop()结果为0
op2=pop(); //减号和除号都有先后顺序,栈顶的为被减数
push(pop()-op2);
break;
case '/': //除号,被除数不能为0,考虑错误情况
op2=pop();
if (op2!=0)
push(pop()/op2);
else
printf("error:zero divisor\n");
break;
case '%': //我用计算机运算出来的-15%4=-3
op2=pop(); //求余命令只能用于整形数
op1=pop();
if(op1!=(int)op1||op2!=(int)op2)
{
printf("error:only Int\n");
break;
}
if(op1<0||op2<0)
if (op1<0&&op2<0)
push((-(int)op1)%(-(int)op2));
else
push(-((-(int)op1)%(-(int)op2)));
else
push((int)op1%(int)op2);
break;
//是ENTER字符的情况
case '\n':
printf("\t%.8g\n",pop());
break;
default:
printf("error:unknown command %s\n",s);
break;
}
}
return 0;
}