前序求值
程式说明
相关函式
get_value():计算并回报结果
说明:将引入的两个运算元与运算子计算,并回传结果。
int get_value(int op1, int op2, char op) { //printf("(%d %c %d)\n", op1, op, op2); switch (op) { case '+': return op1 + op2; case '-': return op1 - op2; case '*': return op1 * op2; case '/': return op1 / op2; case '%': return op1 % op2; default: return 0; }}
Calculation():引入运算式字串,回传求值答案
说明:将引入的字串,用相反的顺序计算,并将每次计算结果存入堆叠,等待输出或引用。
void Calculation(char *str) { char stack[MAX]; int top = 0, j = 0, i; for (i = strlen(str) - 1; i >= 0; i--) { // printf("\n%c\n", str[i]); switch (str[i]) { case '+': case '-': case '*': case '/': case '%': stack[top - 1] = get_value(stack[top], stack[top - 1], str[i]); top--; continue; //遇到运算符号时,将堆叠的前两个数值做运算, //被计算的两个空间移除,存入计算结果。 default: stack[++top] = str[i] - 48; continue; //遇到数值时,减掉48使其为数字型态的真数,存入堆叠空间。 } } printf("%s=%d\n",str ,stack[top]); //结果}
主程式:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#define MAX 20int main() { char str1[MAX] = {"-+2/*3222"}; char str2[MAX] = {"-+-/421*23*41"}; //测资1,2 Calculation(str1); Calculation(str2); return 0;}
后序求值
与前序差异
1:
2:
前置式:计算运算式时,因为是倒置的关係,顺序要相反。后置式:按照原顺序计算即可。