內容
計算五則運算式的結果,包含加、減、乘、除、餘
輸入
輸入一個字串,其中包含運算元及運算子,為了方便讀取,所有的運算子及運算元均以空格區隔。
運算元為 0 ~231 -1 的整數
運算子則包含 + - * / % 及 ( )
運算時請注意先乘除後加減及() 優先運算的計算規則
2 + 3 _ 4
2 _ ( 3 + 4 ) * 5
輸出
輸出結果。為了避免小數點誤差,所有的運算過程都不會產生小數點,可以放心使用整數進行運算
14
70
解題思路
先把輸入的中序式轉成後序式,再解析後序式轉成整數。
完整程式碼
AC (1ms, 96KB)
#include <stdio.h> #define MAX 10000
long long stack[MAX]; char infix[MAX], postfix[MAX], pTop;
char priority(char op) { switch (op) { case '*': case '/': case '%': return 2; case '+': case '-': return 1; default: return 0; } }
void inToPostfix(char* infix, char* postfix) { int sTop = 0; char stack[MAX] = { 0 }; pTop = 0; for (int i = 0; infix[i]; i++) { switch (infix[i]) { case ' ': break; case '(': stack[++sTop] = infix[i]; break; case ')': while (stack[sTop] != '(') { postfix[pTop++] = stack[sTop--]; } sTop--; break; case '+': case '-': case '*': case '/': case '%': while (priority(infix[i]) <= priority(stack[sTop])) { postfix[pTop++] = stack[sTop--]; } stack[++sTop] = infix[i]; break; default: do { postfix[pTop++] = infix[i++]; } while (infix[i] >= '0' && infix[i] <= '9'); postfix[pTop++] = ' '; i--; } } while (sTop) { postfix[pTop++] = stack[sTop--]; } postfix[pTop++] = '\0'; }
long long cale(long long lhs, long long rhs, char op) { switch (op) { case '+': return lhs + rhs; case '-': return lhs - rhs; case '*': return lhs * rhs; case '/': return lhs / rhs; case '%': return lhs % rhs; } return -1; }
long long postfixToInt(char* postfix) { stack[0] = 0; int sTop = 0; char* now = postfix - 1; for (int i = 0; postfix[i]; i++) { if (postfix[i] >= '0' && postfix[i] <= '9') { stack[sTop] = stack[sTop] * 10 + (postfix[i] - '0'); } else if (postfix[i] == ' ') { sTop++; } else { sTop--; stack[sTop - 1] = cale(stack[sTop - 1], stack[sTop], postfix[i]); stack[sTop] = 0; } } return stack[0]; }
int main() { while (gets(infix) != NULL) { inToPostfix(infix, postfix); printf("%lld\n", postfixToInt(postfix)); } return 0; }
|