前言
This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。
提出问题
23.Algorithm Gossip: 后序式的运算
说明
将中序式转换为后序式的好处是,不用处理运算子先后顺序问题,只要依序由运算式由前往后读取即可。
解法
上一节已讲。
分析和解释
代码
#include <stdio.h>
#include <stdlib.h>
void evalPf(char*);
double cal(double,char,double);
int main(void) {
char input[80];
printf("输入后序式:");
scanf("%s", input);
evalPf(input);
return 0;
}
void evalPf(char* postfix){
double stack[80] = {0.0};
char temp[2];
char token;
int top = 0, i = 0;
temp[1] = ' ';
while(1){
token = postfix[i];
switch(token){
case ' ':
printf("ans = %f
", stack[top]);
return;
case '+': case '-': case '*': case '/':
stack[top-1] =
cal(stack[top],token,stack[top-1]);
top--;
break;
default:
if(top < sizeof(stack)/ sizeof(float)) {
temp[0] = postfix[i];
top++;
stack[top] = atof(temp);
}
break;
}
i++;
}
}
double cal(double p1,char op,double p2){
switch(op){
case '+':
return p1 + p2;
case '-':
return p1 - p2;
case '*':
return p1 * p2;
case '/':
return p1 / p2;
}
}
拓展和关联
后记
参考书籍
- 《经典算法大全》
- 维基百科