源自《The C Programming Language》 P62 ex4.3: 计算例如:(1 - 2) * (4 + 5)的值,采用逆波兰表示法(即后缀表示法) 代码: main.c #include <stdio.h> #include <stdlib.h> //为了使用库函数atof #include <math.h> //使用sin, exp, pow等数学函数 #include <string.h> //使用strcmp, strlen等字符串函数 #include "getop.h" #define MAXOP 100 //操作数或运算符的最大长度(待处理字符串的最大长度) #define NUMBER '0' //标识找到一个数 #define NAME 'n' //标示找到一个数学函数 void push(double ); double pop(); //void printStack(double []); void clear(); void mathfnc(char []); //extern double val[]; //如果声明为extern val[]; 则报错:变量val被重定义 //extern sp; //逆波兰计算器 int main() { int type; double op2; double op1; //double tmp; char s[MAXOP]; while((type = getop(s)) != EOF) { switch(type) { case NUMBER: //当待处理字符串是数值字符串时,将其转换,并压栈 push(atof(s)); break; case '+': push(pop() + pop()); break; case '*': push(pop() * pop()); break; case '-': op2 = pop(); push(pop() - op2); //push(pop() - pop());是错误的,虽然算法运算符中操作数的结合方式是从左到右 //但是不能确定push参数中左边的pop函数一定比右边的pop函数先执行 break; case '/': op2 = pop(); if(op2 != 0.0) push(pop() / op2); else { printf("error: divide 0.0!"); return -1; } break; case '%': op2 = pop(); if(op2 != 0.0) push(fmod(pop(), op2)); else printf("error: mod 0.0!"); break; case '/n': //当键入换行符时,打印输出栈顶元素 /*if(sp > 0) printStack(val); else printf("error: stack empty!/n"); */ printf("the result = %.8g/n", pop()); break; case 'p': //不出栈的情况下,打印栈顶元素 op2