fork download
  1. #include <stdio.h>
  2.  
  3. #define SIZE 10
  4. double stack[SIZE];
  5. int sp;
  6.  
  7. void push(double value);
  8. double pop(void);
  9. int isFull(void);
  10. int isEmpty(void);
  11. void answer(void);
  12. void reset(void);
  13.  
  14. int main(void)
  15. {
  16. reset();
  17. int resp;
  18. double num1, num2, value;
  19.  
  20. while (1)
  21. {
  22. if (scanf("%d", &resp) != 1) {
  23. printf("Invalid input.\n");
  24. return 1; // エラー発生時に終了
  25. }
  26. if (resp == 9) break;
  27.  
  28. switch (resp)
  29. {
  30. case 5: // データ入力
  31. if (scanf("%lf", &value) != 1) {
  32. printf("Invalid input.\n");
  33. break;
  34. }
  35. push(value);
  36. break;
  37.  
  38. case 1: // 足し算
  39. if (isEmpty()) {
  40. printf("Stack is empty.\n");
  41. break;
  42. }
  43. num1 = pop();
  44. if (isEmpty()) {
  45. printf("Stack is empty.\n");
  46. push(num1); // 元の値を戻す
  47. break;
  48. }
  49. num2 = pop();
  50. push(num1 + num2);
  51. break;
  52.  
  53. case 2: // 引き算
  54. if (isEmpty()) {
  55. printf("Stack is empty.\n");
  56. break;
  57. }
  58. num1 = pop();
  59. if (isEmpty()) {
  60. printf("Stack is empty.\n");
  61. push(num1); // 元の値を戻す
  62. break;
  63. }
  64. num2 = pop();
  65. push(num2 - num1);
  66. break;
  67.  
  68. case 3: // 掛け算
  69. if (isEmpty()) {
  70. printf("Stack is empty.\n");
  71. break;
  72. }
  73. num1 = pop();
  74. if (isEmpty()) {
  75. printf("Stack is empty.\n");
  76. push(num1); // 元の値を戻す
  77. break;
  78. }
  79. num2 = pop();
  80. push(num2 * num1);
  81. break;
  82.  
  83. case 4: // 割り算
  84. if (isEmpty()) {
  85. printf("Stack is empty.\n");
  86. break;
  87. }
  88. num1 = pop();
  89. if (isEmpty()) {
  90. printf("Stack is empty.\n");
  91. push(num1); // 元の値を戻す
  92. break;
  93. }
  94. num2 = pop();
  95. if (num1 == 0) {
  96. printf("Division by zero error.\n");
  97. push(num2); // 元の値を戻す
  98. push(num1); // 元の値を戻す
  99. break;
  100. }
  101. push(num2 / num1);
  102. break;
  103.  
  104. default:
  105. printf("Invalid choice.\n");
  106. break;
  107. }
  108. }
  109.  
  110. answer();
  111.  
  112. return 0;
  113. }
  114.  
  115. void push(double value)
  116. {
  117. if (isFull()) {
  118. printf("Stack is full.\n");
  119. } else {
  120. stack[sp++] = value;
  121. }
  122. }
  123.  
  124. double pop(void)
  125. {
  126. if (isEmpty()) {
  127. printf("Stack is empty.\n");
  128. return 0; // エラー値(エラー処理として0を返す)
  129. } else {
  130. return stack[--sp];
  131. }
  132. }
  133.  
  134. int isFull(void)
  135. {
  136. return sp == SIZE;
  137. }
  138.  
  139. int isEmpty(void)
  140. {
  141. return sp == 0;
  142. }
  143.  
  144. void answer(void)
  145. {
  146. if (isEmpty()) {
  147. printf("Stack is empty.\n");
  148. } else {
  149. printf("Answer: %f\n", stack[sp - 1]);
  150. }
  151. }
  152.  
  153. void reset(void)
  154. {
  155. sp = 0; // スタックポインタをリセットして空にする
  156. }
  157.  
Success #stdin #stdout 0s 5280KB
stdin
5
1
5
2
2
9
stdout
Answer: -1.000000