fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX 80
  5.  
  6. void inToPostfix(char*, char*); // 中序轉後序
  7. int priority(char); // 運算子優先
  8. double eval(char*);
  9. double cal(char, double, double);
  10.  
  11. int main(void) {
  12. char infix[MAX] = {'\0'};
  13.  
  14. printf("運算式:");
  15. scanf("%s", infix);
  16. printf("%f", eval(infix));
  17.  
  18. return 0;
  19. }
  20.  
  21. void inToPostfix(char* infix, char* postfix) {
  22. char stack[MAX] = {'\0'};
  23. int i, j, top;
  24. for(i = 0, j = 0, top = 0; infix[i] != '\0'; i++) switch(infix[i]) {
  25. case '(': // 運算子堆疊
  26. stack[++top] = infix[i];
  27. break;
  28. case '+': case '-': case '*': case '/':
  29. while(priority(stack[top]) >= priority(infix[i])) {
  30. postfix[j++] = stack[top--];
  31. }
  32. stack[++top] = infix[i]; // 存入堆疊
  33. break;
  34. case ')':
  35. while(stack[top] != '(') { // 遇 ) 輸出至 (
  36. postfix[j++] = stack[top--];
  37. }
  38. top--; // 不輸出 (
  39. break;
  40. default: // 運算元直接輸出
  41. postfix[j++] = infix[i];
  42. }
  43. while(top > 0) {
  44. postfix[j++] = stack[top--];
  45. }
  46. }
  47.  
  48. int priority(char op) {
  49. switch(op) {
  50. case '+': case '-': return 1;
  51. case '*': case '/': return 2;
  52. default: return 0;
  53. }
  54. }
  55.  
  56. double eval(char* infix) {
  57. char postfix[MAX]= {'\0'};
  58. char opnd[2] = {'\0'};
  59. double stack[MAX] = {0.0};
  60.  
  61. inToPostfix(infix, postfix);
  62.  
  63. int top, i;
  64. for(top = 0, i = 0; postfix[i] != '\0'; i++) switch(postfix[i]) {
  65. case '+': case '-': case '*': case '/':
  66. stack[top - 1] = cal(postfix[i], stack[top - 1], stack[top]);
  67. top--;
  68. break;
  69. default:
  70. opnd[0] = postfix[i];
  71. stack[++top] = atof(opnd);
  72. }
  73.  
  74. return stack[top];
  75. }
  76.  
  77. double cal(char op, double p1, double p2) {
  78. switch(op) {
  79. case '+': return p1 + p2;
  80. case '-': return p1 - p2;
  81. case '*': return p1 * p2;
  82. case '/': return p1 / p2;
  83. }
  84. }
  85.  
Success #stdin #stdout 0.01s 5280KB
stdin
8
stdout
運算式:8.000000