fork download
  1. #include <stdio.h>
  2.  
  3. #define SIZE 100
  4.  
  5. double stack[SIZE];
  6. int sp = 0; // スタックポインタ
  7.  
  8. // ===== スタック関連の関数 =====
  9.  
  10. // スタックを空にする
  11. void reset(void) {
  12. sp = 0;
  13. }
  14.  
  15. // スタックが満杯かどうか
  16. int isFull(void) {
  17. return sp >= SIZE;
  18. }
  19.  
  20. // スタックが空かどうか
  21. int isEmpty(void) {
  22. return sp == 0;
  23. }
  24.  
  25. // データをスタックに入れる
  26. void push(double x) {
  27. if (isFull()) {
  28. printf("Stack overflow!\n");
  29. return;
  30. }
  31. stack[sp++] = x;
  32. }
  33.  
  34. // データをスタックから取り出す
  35. double pop(void) {
  36. if (isEmpty()) {
  37. printf("Stack underflow!\n");
  38. return 0.0;
  39. }
  40. return stack[--sp];
  41. }
  42.  
  43. // 結果を表示
  44. void answer(void) {
  45. if (isEmpty()) {
  46. printf("Stack is empty.\n");
  47. } else {
  48. printf("answer:%lf\n", stack[sp - 1]);
  49. }
  50. }
  51.  
  52. // ===== メイン関数 =====
  53. int main(void) {
  54. int n;
  55. double a, b, x;
  56.  
  57.  
  58. while (2) {
  59. scanf("%d", &n);
  60.  
  61. switch (n) {
  62. case 1: // +
  63. b = pop();
  64. a = pop();
  65. push(a + b);
  66. break;
  67.  
  68. case 2: // -
  69. b = pop();
  70. a = pop();
  71. push(a - b);
  72. break;
  73.  
  74. case 3: // *
  75. b = pop();
  76. a = pop();
  77. push(a * b);
  78. break;
  79.  
  80. case 4: // /
  81. b = pop();
  82. a = pop();
  83. push(a / b);
  84. break;
  85.  
  86. case 5: // データ入力
  87. scanf("%lf", &x);
  88. printf("data:%lf\n", x);
  89. push(x);
  90. break;
  91.  
  92. case 9: // 結果表示
  93. answer();
  94. return 0;
  95.  
  96. default:
  97. printf("Unknown command.\n");
  98. }
  99. }
  100. }
  101.  
Success #stdin #stdout 0s 5312KB
stdin
5
3
5
1
1
9
5
1
5
2
2
9
stdout
data:3.000000
data:1.000000
answer:4.000000