/* 後序式的運算 說明: 將中序式轉換為後序式的好處是,不用處理運運算元先後順序問題,只要依序由運算式由前往後讀取即可。 解法: 運算時由後序式的前方開始讀取,遇到運算元先存入堆疊,如果遇到運運算元,則由堆疊中取出兩個運算元進行對應的運算,然後將 結果存回堆疊,如果運算式讀取完畢,那麼堆疊頂的值就是答... ...
/* 後序式的運算 說明: 將中序式轉換為後序式的好處是,不用處理運運算元先後順序問題,只要依序由運算式由前往後讀取即可。 解法: 運算時由後序式的前方開始讀取,遇到運算元先存入堆疊,如果遇到運運算元,則由堆疊中取出兩個運算元進行對應的運算,然後將 結果存回堆疊,如果運算式讀取完畢,那麼堆疊頂的值就是答案了,例如我們計算12+34+* 這個運算式 (也就 是(1+2)*(3+4) ): 讀取 堆疊 1 1 2 12 + 3 3 33 (1+2後存回) 4 334 + 37 (3+4後存回) * 21 (3*7後存回) */ #include <stdio.h> #include <stdlib.h> void evalPf(char* ); double cal(double, char, double); int main(void) { char input[80]; printf("input the postfix: "); 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] = '\0'; while(1) { token = postfix[i]; switch(token) { case '\0': printf("ans = %f \n", 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; } }