fork download
  1. #include<stdio.h>
  2. #define SIZE 10
  3.  
  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. int choice;
  16. double val, val1, val2;
  17.  
  18. reset();
  19.  
  20. // (1) メイン処理のループ
  21. while(1){
  22. if (scanf("%d", &choice) == EOF) break;
  23.  
  24. if (choice == 9) { // 9で計算結果表示・終了
  25. break;
  26. }
  27.  
  28. switch(choice) {
  29. case 1: // 足し算 (+)
  30. val2 = pop();
  31. val1 = pop();
  32. push(val1 + val2);
  33. break;
  34. case 2: // 引き算 (-)
  35. val2 = pop();
  36. val1 = pop();
  37. push(val1 - val2);
  38. break;
  39. case 3: // 掛け算 (*)
  40. val2 = pop();
  41. val1 = pop();
  42. push(val1 * val2);
  43. break;
  44. case 4: // 割り算 (/)
  45. val2 = pop();
  46. val1 = pop();
  47. push(val1 / val2);
  48. break;
  49. case 5: // データ入力
  50. scanf("%lf", &val);
  51. push(val);
  52. break;
  53. default:
  54. break;
  55. }
  56. }
  57.  
  58. answer();
  59. return 0;
  60. }
  61.  
  62. // (2) reset 関数:スタックを初期化
  63. void reset(void) {
  64. sp = 0;
  65. }
  66.  
  67. // (3) answer 関数:結果を表示
  68. void answer(void) {
  69. if (!isEmpty()) {
  70. printf("answer:%f\n", stack[sp - 1]);
  71. }
  72. }
  73.  
  74. // (4) isEmpty 関数:スタックが空かどうか判定
  75. int isEmpty(void) {
  76. return (sp <= 0);
  77. }
  78.  
  79. // (5) isFull 関数:スタックが満杯かどうか判定
  80. int isFull(void) {
  81. return (sp >= SIZE);
  82. }
  83.  
  84. // (6) pop 関数:スタックから値を取り出す
  85. double pop(void) {
  86. if (!isEmpty()) {
  87. sp--;
  88. return stack[sp];
  89. }
  90. return 0.0;
  91. }
  92.  
  93. // (7) push 関数:スタックに値を追加
  94. void push(double value) {
  95. if (!isFull()) {
  96. stack[sp] = value;
  97. sp++;
  98. }
  99. }
  100.  
Success #stdin #stdout 0s 5312KB
stdin
2
5
2
9
3
stdout
answer:2.000000